#include <iostream>
class Base
{
public:
int id;
};
int main()
{
Base b();
b.id = 1;
}
上面代码中的对象创建有什么问题? Base b()
和Base b
之间有什么区别?
答案 0 :(得分:2)
此
Base b();
被解析为名为b()
的函数的函数声明,该函数返回Base
个对象。你需要这个:
Base b;
这将实例化一个Base
对象并调用其默认构造函数。请注意,这不会归零base::id
。您可以通过提供执行此操作的默认构造函数来解决此问题:
class Base
{
public:
Base() : id(0) {}
int id;
};
以相同的方式实例化:
Base b;
答案 1 :(得分:2)
问题是你不实例化一个对象,而是声明一个函数。这样:
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中,您可以使用统一初始化语法来创建类的实例,就像您尝试的那样,但使用大括号而不是括号:< / p>
Base b{}; // Object instantiation! (what you want, in C++11)