調用時機
-
當用類的一個對象初始化該類的另一個對象時
-
當一個函數的形參是一個對象,調用函數進行形參與實參結合時(形參是實參的一份拷貝)
-
函數的返回值是一個對象,函數返回時(返回值是一個新的變量,除非返回引用)
誤區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;
}