C 拷貝建構函式被呼叫的時機

2021-08-01 23:08:21 字數 1051 閱讀 4270

拷貝構造函式呼叫的幾種情況:

當用類的乙個物件去初始化該類的另乙個物件(或引用)時系統自動呼叫拷貝建構函式實現拷貝賦值。

若函式的形參為類物件,呼叫函式時,實參賦值給形參,系統自動呼叫拷貝建構函式。(這裡可有可能被編譯器優化)

當函式的返回值是類物件時,系統自動呼叫拷貝建構函式。(注意會有編譯器可能會進行優化,而觀察不到拷貝的發生)

#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...