взять два следующих класса:
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
Если вы не знаете определения POD в c ++ 0x:
Класс / структура считается POD, если он тривиален, стандартная схемаи если все его нестатические члены являются POD.
Тривиальный класс или структура определяется как тот, который:
- Имеет тривиальный конструктор по умолчанию.При этом может использоваться синтаксис конструктора по умолчанию (SomeConstructor () = default;).
- Имеет тривиальный конструктор копирования, который может использовать синтаксис по умолчанию.
- Имеет тривиальный оператор назначения копирования, который можетиспользуйте синтаксис по умолчанию.
- Имеет тривиальный деструктор, который не должен быть виртуальным.
Класс или структура стандартного макета определяются как:
- Имеет только нестатические элементы данных стандартного типа
- Имеет одинаковый контроль доступа (открытый, закрытый, защищенный) для всех нестатических элементов
- Не имеет виртуальныхфункции
- не имеет виртуальных базовых классов
- имеет только базовые классы типа стандартной компоновки
- не имеет базовых классов того же типа, что и первый определенный нестатикmember
- Либо не имеет базовых классов с нестатическими членами, либо не имеет нестатических элементов данных в наиболее производном классе и не более одного базового класса с нестатическими членами.По сути, в иерархии этого класса может быть только один класс, который имеет нестатические члены.
Если вы не знаете, что такое тривиальный конструктор или оператор:
Компилятор генерирует тривиальный элемент для каждого из следующих элементов класса, еслине объявлен пользователем: конструктор копирования, деструктор и оператор назначения копирования.
А также, если для класса нет объявленного пользователем конструктора, для этого класса генерируется простой конструктор по умолчанию, если есть какие-либо объявленные пользователемконструкторы, вы можете использовать синтаксис (SomeConstructor () = default;), чтобы создать свой собственный простой конструктор по умолчанию.