使用建構函式直接賦值與使用初始化列表的不同
阿新 • • 發佈:2019-01-10
在C++中,對於成員變數的初始化主要有兩種方式:
1. 直接在建構函式中進行賦值
2. 使用建構函式初始化列表進行賦值
雖然在現代編譯器中,這兩種初始化方式幾乎沒有效能上的差異,但是需要知道的是,這兩種初始化操作實際上是不同的。
通過建構函式直接進行初始化,對於自定義型別的成員變數,需要先呼叫預設建構函式構造改成員,然後呼叫對應的賦值操作函式;
而對於使用初始列表的情況,只需要呼叫一次拷貝建構函式即可。
參考以下程式碼:
class Base { public: Base() { mData = 1; cout << "class Base: constructor is called." << endl; } Base(const Base& c) { mData = c.mData; cout << "class Base: copy constructor is called." << endl; } Base& operator =(Base& c) { this->mData = c.mData; cout << "class Base: assignment operation." << endl; return *this; } private: int mData; }; class ListInit { public: ListInit(Base c) : mBase(c) { } private: Base mBase; }; class FuncInit { public: FuncInit(Base c) { mBase = c; } private: Base mBase; };
使用建構函式進行初始化:
int main()
{
Base b;
FuncInit f(b);
system("pause");
return 0;
}
輸出為:
使用初始化列表:
int main()
{
Base b;
ListInit l(b);
system("pause");
return 0;
}
輸出為:
上面的結果中,都會呼叫一次拷貝建構函式,是因為傳入入參的時候會生成一個臨時引數。
對於內建基本型別而言,這兩種初始化操作沒有差別。