在 C++ 中,初始化列表和在构造函数中赋值而不是每个方法的外观有什么区别?我的意思是使用其中一种而不是另一种的优势是什么,为什么在幻灯片(如下)的给定示例中仅适用于初始化?(我希望你能添加一些资源,因为我没有找到)
小智 6
在构造函数中使用初始化列表是一步过程,即它在声明\xe2\x80\x99s 时初始化对象。它调用复制构造函数。
\n\n而使用赋值是一个两步过程,即定义对象然后对其进行赋值。定义对象调用默认构造函数,然后赋值调用赋值运算符。因此,操作成本高昂。
\n\n在C++中,类的常量或引用数据成员变量只能在初始化列表中初始化,而不能在构造函数体内使用赋值。
\n\n常量和引用数据成员变量都具有必须在声明时初始化的属性。因此,只有在构造函数中使用初始化列表的方法,因为初始化列表在声明时初始化类成员变量,而构造函数体的赋值在声明后初始化数据成员。
\n\n在某些情况下,构造函数内的数据成员初始化不起作用,并且必须使用初始化列表。以下是此类案例。
\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\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
\n\n\nRun Code Online (Sandbox Code Playgroud)\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
\n\n\nRun Code Online (Sandbox Code Playgroud)\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