gvg*_*zio 4 c++ constructor const class initializer-list
在一些教程(例如http://www.tutorialspoint.com/cplusplus/cpp_constructor_destructor.htm)上,我读到以下两个代码是等效的.
第一个代码:
class MyClass1{
public:
int a;
int b;
MyClass1(int a, int b) : a(a), b(b) {};
};
Run Code Online (Sandbox Code Playgroud)
第二个代码:
class MyClass2{
public:
int a;
int b;
MyClass2(int, int);
};
MyClass2::MyClass2(int a, int b){
this->a = a;
this->b = b;
}
Run Code Online (Sandbox Code Playgroud)
事实上,他们给了我相同的结果.但是,如果我使用const成员,我将无法再编译代码.
class MyClass1{
public:
const int a;
const int b;
MyClass1(int a, int b) : a(a), b(b) {};
};
class MyClass2{
public:
const int a;
const int b;
MyClass2(int, int);
};
MyClass2::MyClass2(int a, int b){
this->a = a;
this->b = b;
}
Run Code Online (Sandbox Code Playgroud)
事实上,第一堂课没有给我任何错误,但在第二堂课有一个assignment of read-only member.所以,这些是问题:
这两种初始化方法的真正区别是什么?
使用初始化列表是初始化const类成员的唯一方法吗?
注意:我在线阅读委托构造函数的使用以避免这个问题,但我不清楚它们的用途和它们的真正用途.
查看它的一种简单方法是与局部变量建立连接:
使用初始化列表等效于此局部变量视图:
int a = 1;
int b = 2;
Run Code Online (Sandbox Code Playgroud)第二种形式,在构造函数中分配它们等效于:
int a;
int b;
a = 1;
b = 2;
Run Code Online (Sandbox Code Playgroud)你可以看到这对const或者没有默认构造函数的对象有什么问题:
好:
const int a = 1;
const int b = 2;
Run Code Online (Sandbox Code Playgroud)不好:
const int a;
const int b;
a = 1;
b = 2;
Run Code Online (Sandbox Code Playgroud)例如:
class X {
public:
X() = delete; // default constructor deleted
X(int){}; // constructor with an int parameter
};
Run Code Online (Sandbox Code Playgroud)
好:
X x(1);
Run Code Online (Sandbox Code Playgroud)不好:
X x;
x = X(1);
Run Code Online (Sandbox Code Playgroud)class A {
public:
const int a = 10;
};
Run Code Online (Sandbox Code Playgroud)