13、类的成员初始化

厨子小于 1 分钟C++C++基础编程程序厨

review代码时,有同学问下面这段代码为什么不能通过编译:

class A {
public:
  int a(100);
};

int main() { A a; }

这里有涉及成员初始化的概念。

C++中的类成员初始化只有两种方式:

一种是通过构造函数初始化列表,也就是这样:

class A {
 public:
 A() : a(100) {}
 int a;
};

另外一种是通过大括号形式进行默认成员初始化

class A {
 public:
 int a{100};
};

而最上面那个图中的括号初始化不属于以上两种中的任意一种,所以编译器就会报错。

那这里有个问题,以上两种方式都能初始化,那如果同时存在会出现什么行为

如果同时存在,那大括号形式的默认成员初始化会被忽略,而去使用构造函数初始化列表。

比如下面的代码:

class A {
 public:
 A() : a(200) {}
 int a{100};
};

int main() {
 A a;
 std::cout << a.a;
}

会输出200

具体可以看cppreference:https://en.cppreference.com/w/cpp/language/data_members#Member_initializationopen in new window