2
#include <iostream>

class Base
{
    public:
        int id;
};

int main()
{
    Base b();
    b.id = 1; 
}

上面代码中的对象创建有什么问题?Base b()和 和有什么不一样Base b

4

2 回答 2

3

Base b();

b()被解析为返回Base对象的被调用函数的函数声明。你需要这个:

Base b;

这将实例化一个Base对象并调用其默认构造函数。请注意,这不会将初始化归零base::id。您可以通过提供执行此操作的默认构造函数来解决此问题:

class Base
{
    public:
        Base() : id(0) {}
        int id;
};

并以相同的方式实例化:

Base b;
于 2013-03-08T18:33:57.923 回答
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 中,您可以使用统一初始化语法几乎按照您尝试的方式创建类的实例,但使用大括号而不是括号:

Base b{}; // Object instantiation! (what you want, in C++11)
于 2013-03-08T18:34:13.087 回答