在某些教程(例如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) {};
};

第二个代码:
class MyClass2{
    public:
        int a;
        int b;
        MyClass2(int, int);
};

MyClass2::MyClass2(int a, int b){
    this->a = a;
    this->b = b;
}

实际上,它们给我相同的结果。但是,如果我使用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;
}

实际上,第一个类没有给我任何错误,但是在第二堂课中有一个assignment of read-only member。因此,这些是问题:

两种初始化方法之间的真正区别是什么?

使用初始化列表是初始化类的const成员的唯一方法吗?

注意:为了避免出现此问题,我在线阅读了delegating constructors的用法,但我不清楚它们的用法以及它们的作用。

最佳答案

一种简单的查看方法是使用局部变量进行连接:

  • 使用初始化程序列表等效于此局部变量 View :
    int a = 1;
    int b = 2;
    
  • 第二种形式,在构造函数内部分配它们等效于此:
    int a;
    int b;
    
    a = 1;
    b = 2;
    

  • 您可以看到const或没有默认构造函数的对象怎么可能出现问题:

    const成员
  • 好:
    const int a = 1;
    const int b = 2;
    
  • 不好:
    const int a;
    const int b;
    a = 1;
    b = 2;
    

  • 具有已删除或不可访问的默认构造函数的类型

    例如。:
    class X {
    public:
       X() = delete; // default constructor deleted
       X(int){};     // constructor with an int parameter
    };
    
  • 好:
    X x(1);
    
  • 不好:
    X x;
    x = X(1);
    

  • 第三个选项:In-class member initializers (since c++11)
    class A {
    public:
       const int a = 10;
    };
    

    关于c++ - 使用初始化列表初始化字段并在构造函数内部对其进行初始化之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33520679/

    10-16 16:00