C++ 初始化列表与赋值

3 c++ initialization class

在 C++ 中,初始化列表和在构造函数中赋值而不是每个方法的外观有什么区别?我的意思是使用其中一种而不是另一种的优势是什么,为什么在幻灯片(如下)的给定示例中仅适用于初始化?(我希望你能添加一些资源,因为我没有找到)

点击此处查看幻灯片:已上传至 imgur

小智 6

在构造函数中使用初始化列表是一步过程,即它在声明\xe2\x80\x99s 时初始化对象。它调用复制构造函数。

\n\n

而使用赋值是一个两步过程,即定义对象然后对其进行赋值。定义对象调用默认构造函数,然后赋值调用赋值运算符。因此,操作成本高昂。

\n\n

在C++中,类的常量或引用数据成员变量只能在初始化列表中初始化,而不能在构造函数体内使用赋值。

\n\n

常量和引用数据成员变量都具有必须在声明时初始化的属性。因此,只有在构造函数中使用初始化列表的方法,因为初始化列表在声明时初始化类成员变量,而构造函数体的赋值在声明后初始化数据成员。

\n\n

在某些情况下,构造函数内的数据成员初始化不起作用,并且必须使用初始化列表。以下是此类案例。

\n\n
    \n
  1. 用于非静态 const 数据成员的初始化。
  2. \n
\n\n
\n
#include<iostream> \nusing namespace std; \n\nclass Test { \n    const int t; \npublic: \n    Test(int t):t(t) {}  //Initializer list must be used \n    int getT() { return t; } \n}; \n\nint main() { \n    Test t1(10); \n    cout<<t1.getT(); \n    return 0; \n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n
    \n
  1. 用于初始化参考成员。
  2. \n
\n\n
\n
#include<iostream> \nusing namespace std; \n\nclass Test { \n    int &t; \npublic: \n    Test(int &t):t(t) {}  //Initializer list must be used \n    int getT() { return t; } \n}; \n\nint main() { \n    int x = 20; \n    Test t1(x); \n    cout<<t1.getT()<<endl; \n    x = 30; \n    cout<<t1.getT()<<endl; \n    return 0; \n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n
    \n
  1. 用于初始化没有默认构造函数的成员对象。(在您的情况下,数组数字没有默认构造函数)
  2. \n
\n\n
\n
#include <iostream>\nusing namespace std;\nclass A { \n    int i; \npublic: \n    A(int ); \n}; \n\nA::A(int arg) { \n    i = arg; \n    cout << "A\'s Constructor called: Value of i: " << i << endl; \n} \n\n// Class B contains object of A \nclass B { \n    A a; \npublic: \n    B(int ); \n}; \n\nB::B(int x):a(x) {  //Initializer list must be used \n    cout << "B\'s Constructor called"; \n} \n\nint main() { \n    B obj(10); \n    return 0; \n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n
    \n
  1. 用于基类成员的初始化。
  2. \n
  3. 当 constructor\xe2\x80\x99s 参数名称与数据成员相同时。
  4. \n
  5. 出于性能原因。
  6. \n
\n