C++ C++;实例化一个类 #包括 阶级基础 { 公众: int-id; }; int main() { 碱基b(); b、 id=1; }

C++ C++;实例化一个类 #包括 阶级基础 { 公众: int-id; }; int main() { 碱基b(); b、 id=1; },c++,C++,上面代码中的对象创建有什么问题?Base b()和Base b之间有什么区别 #include <iostream> class Base { public: int id; }; int main() { Base b(); b.id = 1; } 被解析为名为b()的函数的函数声明,该函数返回一个Base对象。你需要这个: Base b(); 这将实例化Base对象并调用其默认构造函数。请注意,这将不会零初始化base::id。您

上面代码中的对象创建有什么问题?
Base b()
Base b
之间有什么区别

#include <iostream>

class Base
{
    public:
        int id;
};

int main()
{
    Base b();
    b.id = 1; 
}
被解析为名为
b()
的函数的函数声明,该函数返回一个
Base
对象。你需要这个:

Base b();
这将实例化
Base
对象并调用其默认构造函数。请注意,这将不会零初始化
base::id
。您可以通过提供默认构造函数来解决此问题:

Base b;
并以相同的方式实例化:

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

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

Base b();
这将实例化
Base
对象并调用其默认构造函数。请注意,这将不会零初始化
base::id
。您可以通过提供默认构造函数来解决此问题:

Base b;
并以相同的方式实例化:

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

问题在于,您不是在实例化对象,而是在声明函数。这:

声明一个函数
b()
,该函数返回类型为
Base
的对象,并且不接受任何参数。因此,当您稍后尝试访问成员
id
时,编译器会发出错误,因为函数没有成员:

Base b(); // Function declaration! (not what you want)
如果要创建
Base
的实例,只需删除括号即可:

b.id = 1; // ERROR! b is a function, accessing member "id" makes no sense
Base b; // Object instantiation! (what you want)
请注意,在C++11中,您可以使用统一初始化语法创建类的实例,方法与您尝试的方法基本相同,但使用大括号而不是括号:

b.id = 1; // ERROR! b is a function, accessing member "id" makes no sense
Base b; // Object instantiation! (what you want)

问题在于,您不是在实例化对象,而是在声明函数。这:

声明一个函数
b()
,该函数返回类型为
Base
的对象,并且不接受任何参数。因此,当您稍后尝试访问成员
id
时,编译器会发出错误,因为函数没有成员:

Base b(); // Function declaration! (not what you want)
如果要创建
Base
的实例,只需删除括号即可:

b.id = 1; // ERROR! b is a function, accessing member "id" makes no sense
Base b; // Object instantiation! (what you want)
请注意,在C++11中,您可以使用统一初始化语法创建类的实例,方法与您尝试的方法基本相同,但使用大括号而不是括号:

b.id = 1; // ERROR! b is a function, accessing member "id" makes no sense
Base b; // Object instantiation! (what you want)

如果你有一个构造函数,比如Base(intid)@干杯。-阿尔夫,我肯定这是一个复制品,但这不是最烦人的解析。@QuentinUK,不,它不会t@juanchopanza:当然,除非你接受一个基于形式语法的不切实际、愚蠢、愚蠢、愚蠢、迟钝等区别(我肯定斯科特不是那个意思,但他无法预见会被那些不思考的人解读)@AndyProwl哦,我明白你的意思。不过,同样地,我也可以说
TimeKeeper time\u keeper(Timer());
在语法上也不是一种声明对象的有效方法,因为它是一个函数,所以MVP不存在,对吗?我的意思是,如果我想争论的话。如果你有一个构造函数,比如Base(int-id),那会有帮助@Cheersandhth.-Alf我肯定这是一个复制品,但这不是最烦人的解析。@QuentinUK不,它不会t@juanchopanza:当然,除非你接受一个基于形式语法的不切实际、愚蠢、愚蠢、愚蠢、迟钝等区别(我肯定斯科特不是那个意思,但他无法预见会被那些不思考的人解读)@AndyProwl哦,我明白你的意思。不过,同样地,我也可以说
TimeKeeper time\u keeper(Timer());
在语法上也不是声明对象的有效方法,因为它是一个函数,因此MVP不存在,对吗?我的意思是,如果我试图争论。我认为,如果有人觉得产生一个新的答案比引用无数现有的答案更好,那么可以期待一个更完整的答案(即,此处所涵盖的现有答案中缺少的内容)我认为,如果一个人觉得产生一个新答案比参考无数现有答案更好,那么可以期待一个更完整的答案(即,此处所涵盖的现有答案中缺少的内容)哦,我现在明白了…我仍然认为我能够在主函数中声明一个函数,但不能在那里定义它是非常奇怪的。哦,我现在明白了…我仍然认为我能够在主函数中声明一个函数,但不能在那里定义它是非常奇怪的。