使用初始化列表初始化字段并在构造函数内初始化它们之间有什么区别?

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类成员的唯一方法吗?

注意:我在线阅读委托构造函数的使用以避免这个问题,但我不清楚它们的用途和它们的真正用途.

bol*_*lov 7

查看它的一种简单方法是与局部变量建立连接:

  1. 使用初始化列表等效于此局部变量视图:

    int a = 1;
    int b = 2;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二种形式,在构造函数中分配它们等效于:

    int a;
    int b;
    
    a = 1;
    b = 2;
    
    Run Code Online (Sandbox Code Playgroud)

你可以看到这对const或者没有默认构造函数的对象有什么问题:

Const成员

  1. 好:

    const int a = 1;
    const int b = 2;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 不好:

    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)
  1. 好:

    X x(1);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 不好:

    X x;
    x = X(1);
    
    Run Code Online (Sandbox Code Playgroud)

第3个选项:类内成员初始值设定项(自c ++ 11起)

class A {
public:
   const int a = 10;
};
Run Code Online (Sandbox Code Playgroud)