拷貝構造函式呼叫的幾種情況:
當用類的乙個物件去初始化該類的另乙個物件(或引用)時系統自動呼叫拷貝建構函式實現拷貝賦值。
若函式的形參為類物件,呼叫函式時,實參賦值給形參,系統自動呼叫拷貝建構函式。(這裡可有可能被編譯器優化)
當函式的返回值是類物件時,系統自動呼叫拷貝建構函式。(注意會有編譯器可能會進行優化,而觀察不到拷貝的發生)
#include#include#include#include#include#includeusing namespace std;
class a
a(const a& a)
a& operator=(const a&a)
int data;
};void fun1(a a)
a fun2()
int main()
需要注意,在第三條:當函式的返回值是類物件時,系統自動呼叫拷貝建構函式。這裡預設情況下一般會被編譯器優化,減少不必要的拷貝構造,所以,具體的返回值可能會因編譯器及編譯選項的不同而不同。使用g++編譯器,關閉優化g++ ***.cpp -fno-elide-constructors
後執行結果如下(-fno-elide-constructors
選項就是用來關閉拷貝優化的):
拷貝構造函式呼叫
拷貝構造函式呼叫
拷貝構造函式呼叫
拷貝構造函式呼叫
拷貝構造函式呼叫
呼叫賦值函式
預設情況下,優化後的結果如下:
拷貝構造函式呼叫
拷貝構造函式呼叫
拷貝構造函式呼叫
呼叫賦值函式
編譯器具體是怎麼優化的,一般編譯器會先看支不支援拷貝優化,如果不支援,再看有沒有定義移動建構函式,如果都沒有,就呼叫拷貝建構函式。更具體的細節可以參考移動語義及拷貝優化的內容。最後,注意
a c=a;
與d=a;
的不同,乙個是初始化,乙個是賦值。 拷貝建構函式被呼叫的時機
拷貝建構函式被呼叫的時機 1.當用類的乙個物件去初始化該類的另乙個物件 或引用 時系統自動呼叫拷貝建構函式實現拷貝賦值。2.若函式的形參為類物件,呼叫函式時,實參賦值給形參,系統自動呼叫拷貝建構函式。3.當函式的返回值是類物件時,系統自動呼叫拷貝建構函式。下面給出乙個例子 cpp view plai...
拷貝構造函式呼叫的時機
拷貝函式何時會被呼叫呢?最明顯的就是用乙個類物件初始化另外乙個物件的時候 比如x a x 這句語義上就是先建立x 臨時物件,再呼叫x的拷貝建構函式 初始化 a,這只是語義上的,編譯器完全可能優化掉臨時物件 注意區分初始化和賦值 呼叫assignment operator 第二種情況是函式按值傳引數的...
呼叫拷貝建構函式的時機
在c 中,下面三種物件需要呼叫拷貝建構函式 有時也稱 複製建構函式 1 乙個物件作為函式引數,以值傳遞的方式傳入 函式體 2 乙個物件作為函式返回值,以值傳遞的方式從函式返回 3 乙個物件用於給另外乙個物件進行初始化 常稱為賦值初始化 includeusing namespace std class...