拷貝構造函數的調用時機(糾正誤區)

調用時機

  1. 當用類的一個對象初始化該類的另一個對象時

  2. 當一個函數的形參是一個對象,調用函數進行形參與實參結合時(形參是實參的一份拷貝)

  3. 函數的返回值是一個對象,函數返回時(返回值是一個新的變量,除非返回引用)

誤區1

用 = 賦值,調用的不一定是賦值重載函數,還可能是拷貝構造函數,如果左值沒有初始化 則調用拷貝構造函數,左值再次之前進行了初始化 這次是重新賦值調用賦值重載函數

#include <iostream>
class Test {
public:
	Test() { std::cout << "Test()" << std::endl; }
	Test(const Test& t) { std::cout << "Test(const Test&)" << std::endl; }
	Test& operator=(const Test& t) { std::cout << "operator=(const Test&)" << std::endl; return *this; }
};

int main() {
	Test t1;
	Test t2 = t1;

	Test t3;
	t3 = t1;
	return 0;
}

誤區2

當調用函數的時候採用嵌套調用時,返回值賦給參數,按理說返回時調用一次拷貝構造函數,傳參調用一次拷貝構造函數,但是實際上並不是這樣,因爲編譯器會進行優化,直接兩部合爲一步,只調用一次拷貝構造函數

/*
拷貝構造函數總共調用 7 次,因爲函數的返回值作爲了函數參數,編譯器進行了優化,只拷貝構造一次
*/
#include <iostream>
class Test {
public:
	Test() { std::cout << "Test()" << std::endl; }
	Test(const Test& t) { std::cout << "Test(const Test&)" << std::endl; }
};

Test func(Test t) {
	Test t1(t);
	Test t2 = t;
	return t2;
}

int main() {
	Test t;
	func(func(t));

	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章