#include <iostream>
class Base
{
public:
int id;
};
int main()
{
Base b();
b.id = 1;
}
上面代码中的对象创建有什么问题?Base b()
和 和有什么不一样Base b
?
#include <iostream>
class Base
{
public:
int id;
};
int main()
{
Base b();
b.id = 1;
}
上面代码中的对象创建有什么问题?Base b()
和 和有什么不一样Base b
?
这
Base b();
b()
被解析为返回Base
对象的被调用函数的函数声明。你需要这个:
Base b;
这将实例化一个Base
对象并调用其默认构造函数。请注意,这不会将初始化归零base::id
。您可以通过提供执行此操作的默认构造函数来解决此问题:
class Base
{
public:
Base() : id(0) {}
int id;
};
并以相同的方式实例化:
Base b;
问题是您没有实例化一个对象,而是声明一个函数。这:
Base b(); // Function declaration! (not what you want)
声明一个b()
返回类型对象Base
且不接受任何参数的函数。因此,当您稍后尝试访问成员id
时,编译器会发出错误,因为函数没有成员:
b.id = 1; // ERROR! b is a function, accessing member "id" makes no sense
如果要创建 的实例Base
,只需删除括号:
Base b; // Object instantiation! (what you want)
请注意,在 C++11 中,您可以使用统一初始化语法几乎按照您尝试的方式创建类的实例,但使用大括号而不是括号:
Base b{}; // Object instantiation! (what you want, in C++11)