使用花括号初始化类实例化对象

3

我知道在C++中,结构体和类非常相似,结构体成员默认为公有访问,而类的成员默认为私有访问等等。

然而,由于可以按照以下方式初始化结构体实例:

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

问题: 我知道我们可以使用构造函数,如果我像结构体一样初始化类实例,有什么需要注意的陷阱吗?如果我使用这种方法将数据成员初始化为它们的默认值(例如int为0和指针为null),这是否是安全的操作?


3
在C ++中,类和结构体之间没有区别,除了默认的访问权限规定不同。 - NathanOliver
@NathanOliver 那我可以认为使用花括号初始化类实例是安全的吗? - user3437460
1个回答

7
structclass 唯一的区别在于默认访问权限: MyClass 有三个 private 成员,而 MyStruct 有三个 public 成员。因此,MyClass 不是一个聚合体(其中一个要求是类没有私有或受保护的非静态数据成员),这使得这段代码不合法:
MyClass c1 = {1, 2, 3};  // error

但是如果你把MyStruct的成员全部设为public,那么和初始化MyClass没有任何区别。


哦,说得好。我错过了OP没有在类中使用public: - NathanOliver
@Barry 谢谢您的回复。所以,如果 MyClass 的所有数据成员都是公共的,我可以简单地使用“= {1,2,3};”初始化它们,而不必担心太多吗? - user3437460
@user3437460 是的,正如答案中所述,没有任何区别。 - Barry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接