Инициализация экземпляра класса с фигурными скобками

Я знаю, что структура и класс в С++ очень похожи, и члены структуры по умолчанию имеют общий доступ, а члены класса имеют частный доступ и т. д. и т. д.

Однако, поскольку экземпляры структуры могут быть инициализированы следующим образом:

struct MyStruct{
    int a;
    int b;
    int c;
};

MyStruct s1 = {1, 2, 3};  //a=1, b=2, c=3
MyStruct s2 = {};  //a=0, b=0, c=0

Безопасно ли делать то же самое для классов в C++? Например:

class MyClass{
    int a;
    int b;
    int c;
};

MyClass c1 = {1, 2, 3};  //a=1, b=2, c=3
MyClass c2 = {};  //a=0, b=0, c=0

Вопрос: я знаю, что мы можем использовать конструктор(ы), есть ли какие-либо подводные камни, о которых я должен знать, если я инициализирую экземпляр класса, как экземпляры структуры? Является ли это безопасной операцией, если я использую этот подход для инициализации членов данных их значениями по умолчанию (например, 0 для int и null для указателей)?


person user3437460    schedule 08.07.2016    source источник
comment
В C++ нет разницы между классом и структурой, за исключением спецификатора доступа по умолчанию.   -  person NathanOliver    schedule 08.07.2016
comment
@NathanOliver Итак, могу ли я предположить, что безопасно инициализировать экземпляры класса с помощью фигурных скобок?   -  person user3437460    schedule 08.07.2016


Ответы (1)


Единственная разница между struct и class заключается в спецификации доступа по умолчанию: MyClass имеет три private члена, а MyStruct — три public. В результате MyClass не является агрегатом (одно из требований состоит в том, чтобы класс не имел закрытых или защищенных нестатических элементов данных), что делает этот код неправильным:

MyClass c1 = {1, 2, 3};  // error

Но нет никакой разницы между вашей инициализацией MyStruct и вашей инициализацией MyClass, если бы вы сделали все элементы public.

person Barry    schedule 08.07.2016
comment
О, хороший момент. Я пропустил OP, не использовал public: в классе. - person NathanOliver; 08.07.2016
comment
@Барри Спасибо за ответ. Итак, если бы все элементы данных MyClass были общедоступными, я мог бы просто инициализировать их с помощью = {1,2,3}; без особых забот? - person user3437460; 08.07.2016
comment
@user3437460 user3437460 Да, как сказано в ответе, разницы не будет. - person Barry; 08.07.2016