参加以下两门课程:
class Test1{
public:
Test1()=default;
Test1(char in1,char in2):char1(in1),char2(in2){}
char char1;
char char2;
};
class Test2{
public:
Test2()=default;
Test2(char in1,char in2):char1(in1),char2(in2){}
private:
char char1;
char char2;
};
我知道在c ++ 0x中这两个类都被认为是POD类型,我们可以使用初始化列表初始化它们的对象,如下所示:
Test1 obj1={'a','b'};//valid in c++0x
Test2 obj2={'a','b'};//valid in c++0x
但是我想知道技术原因是什么,当我们在下面这样的类中有不同的访问说明符时,不可能使用初始化列表来初始化该类的对象,并且该类不被视为POD类型?
class Test{
public:
Test()=default;
Test(char in1,char in2):char1(in1),char2(in2){}
char char1;
private:
char char2;
};
Test obj={'a','b'};//invalid in c++0x
如果你不知道c ++ 0x中POD的定义:
如果一个类/结构是微不足道的,标准布局,并且它的所有非静态成员都是POD,则它被认为是POD。
一个简单的类或结构被定义为:
标准布局类或结构定义为:
如果您不知道琐碎的构造函数或运算符是什么:
如果不是用户声明的,编译器会为类生成以下每个项目中的一个小部分:
复制构造函数,析构函数和复制赋值运算符
并且如果没有用户声明的类的构造函数,则为该类生成一个简单的默认构造函数,如果有任何用户声明的构造函数,您可以使用语法(SomeConstructor()= default;)来创建自己的琐碎默认构造函数。
答案 0 :(得分:3)
“技术”原因归结于以下原因:
分配具有相同访问控制的(非联合)类的非静态数据成员,以便后面的成员在类对象中具有更高的地址。具有不同访问控制的非静态数据成员的分配顺序是未指定的(C ++0x§9.2/ 12)。
只要所有非静态数据成员具有相同的访问控制权,它们的顺序就是明确的;否则他们的订单没有说明。
答案 1 :(得分:0)
class Test{
public:
Test()=default;
Test(char in1,char in2):char1(in1),char2(in2){}
char char1;
private:
char char2;
};
考虑上面的类以下语法在c ++ 0x中有效:
Test obj={'a','b'};//valid in c++0x
最终提案是here。