1. 程式人生 > >使用建構函式直接賦值與使用初始化列表的不同

使用建構函式直接賦值與使用初始化列表的不同

在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;
}
輸出為:


上面的結果中,都會呼叫一次拷貝建構函式,是因為傳入入參的時候會生成一個臨時引數。

對於內建基本型別而言,這兩種初始化操作沒有差別。