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

02-16 11:25