默认构造函数,为什么我的班级似乎有三个?当编译器对待像结构这样的类时?

noi*_*isy 3 c++ constructor struct class

我一直认为,只有两个默认构造函数:没有参数的构造函数和复制构造函数.

但是今天我写了这样的话:

首先,我想确保在C++中c-style结构的初始化仍然有效.

struct Foo{
    int a;
    bool b;
    char* c;
    double d;
};
//..
Foo arr[2]={{0, true, "a", 3.14}, {1, false, "z", 42.0}};
Run Code Online (Sandbox Code Playgroud)

好的,这很有效.但是接下来,我决定检查后变化会发生什么structclass.

class Bar{
 public:
    int a;
    bool b;
    char* c;
    double d;
};

//..

Bar arr[2]={{0, true, "a", 3.14}, {1, false, "z", 42.0}};//works
Bar bar;                                                 //works
Bar bar2=arr[1];                                         //works
//Bar bar3(2, false, "so", 7.0);                         //of course doesn't work
//first, second, third ways works... 
Run Code Online (Sandbox Code Playgroud)

只要class Bar没有任何私有/受保护字段(但它可以包含方法),这是可编译的.因此,只要编译器可以创建仅使用结构的简单特征的类,那么可以编译它.

  • 第一个问题:我是对的吗?

  • 第二个问题:它是编译器(在这种情况下是gcc)功能还是这正是标准所说的?

[编辑]:

代码//Bar bar3(2, false, "so", 7.0); //of course doesn't work不是问题;)


PS.我还在学英语,但有时候我犯的是愚蠢的错误.我正在尽我所能,用英语写问题和答案,但如果你在任何错误的情况下编辑我的帖子,我会很高兴.我保证,你的努力不会浪费.

fre*_*low 9

我决定检查将struct更改为class后会发生什么.

struct和之间的唯一区别class是成员和默认继承模式的默认可见性.struct D : B { ...相当于class D : public B { public: ....