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_initialization
