访问说明符之间的关系以及在c ++ 0x中使用POD类型的初始化列表

时间:2010-07-18 16:08:22

标签: c++ initialization c++11 aggregate pod

参加以下两门课程:

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。

一个简单的类或结构被定义为:

  1. 有一个简单的默认构造函数。这可以使用默认构造函数语法(SomeConstructor()= default;)。
  2. 有一个简单的复制构造函数,可以使用默认语法。
  3. 有一个普通的复制赋值运算符,可以使用默认语法。
  4. 有一个简单的析构函数,它不能是虚拟的。
  5. 标准布局类或结构定义为:

    1. 仅包含标准布局类型的非静态数据成员
    2. 对所有非静态成员具有相同的访问控制(公共,私有,受保护)
    3. 没有虚拟功能
    4. 没有虚拟基类
    5. 只有标准布局类型的基类
    6. 没有与第一个定义的非静态成员相同类型的基类
    7. 要么没有具有非静态成员的基类,要么在最派生类中没有非静态数据成员,并且最多只有一个具有非静态成员的基类。实质上,此类的层次结构中可能只有一个具有非静态成员的类。
    8. 如果您不知道琐碎的构造函数或运算符是什么:
      如果不是用户声明的,编译器会为类生成以下每个项目中的一个小部分: 复制构造函数,析构函数和复制赋值运算符 并且如果没有用户声明的类的构造函数,则为该类生成一个简单的默认构造函数,如果有任何用户声明的构造函数,您可以使用语法(SomeConstructor()= default;)来创建自己的琐碎默认构造函数。

2 个答案:

答案 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