C 拷貝建構函式的呼叫

2021-05-09 17:14:44 字數 1345 閱讀 2821

晚上做c++作業,碰到乙個拷貝函式的問題,看了會書也沒太看明白,回到寢室馬上試驗了下才差不多弄清楚了拷貝建構函式及臨時物件的呼叫。拷貝建構函式主要在以下三種情況下起初始化作用:

1. 在宣告語句中用乙個物件初始化另乙個物件;

2. 將乙個物件作為引數按值呼叫方式傳遞給另乙個物件時生成物件副本;

3. 生成乙個臨時物件作為函式的返回結果。

那麼接著就看一下在這三種情況下拷貝建構函式分別在什麼時候呼叫,以及如果有臨時物件的話,在什麼時候析構。先假定有乙個類foo,在建構函式中會輸出「constructing.」,在拷貝建構函式中會輸出「copy constructing.」,在析構函式中會輸出「destructing.」。輸出結果中的注釋是說明之用。

在宣告語句中用乙個物件初始化另乙個物件

在宣告語句中用乙個物件初始化另乙個物件時,不存在臨時物件的問題,新的物件直接呼叫拷貝建構函式,進行物件的初始化,也沒有什麼呼叫順序的問題了,例如:

程式**:

[ 複製**到剪貼簿 ]

如果類foo有拷貝建構函式,那麼在定義時就會呼叫拷貝建構函式,在物件的生存週期結束時,呼叫物件的析構函式。上面這段程式的輸出結果就是:

程式**:

[ 複製**到剪貼簿 ]

將乙個物件作為引數按值呼叫方式傳遞給另乙個物件時生成物件副本

將物件按值呼叫作為函式的引數時,在函式的開始將生成乙個臨時物件,如果物件有拷貝建構函式,就使用拷貝建構函式對臨時物件進行初始化,然後在函式結事呼叫臨時物件的析構函式,例如:

程式**:

[ 複製**到剪貼簿 ]

在上面這段**中,先執行的是引數pobj的初始化,然後再進行區域性物件變數obj的初始化。以上**輸出結果如下:

程式**:

[ 複製**到剪貼簿 ]

生成乙個臨時物件作為函式的返回結果

生成乙個臨時物件作為函式的返回結果時,如果返回結果有拷貝建構函式就會呼叫返回結果的拷貝建構函式進行初始化,而且是在return語句執行時進行,並且在return完成時呼叫析構函式,例如:

程式**:

[ 複製**到剪貼簿 ]

在函式get_object()內部,先進行obj的初始化,在執行到return語句時,建立乙個臨時物件,呼叫拷貝建構函式用obj作為引數對臨時物件進行初始化,而之後則是先進行函式內部物件變數的析構,再進行臨時變數的析構,因為臨時變數要在函式外部對可能接收返回值的變數進行賦值。以上**的輸出結果如下:

程式**:

[ 複製**到剪貼簿 ]

就這樣,在vc除錯了3個例子就可以差不多弄清拷貝建構函式的呼叫時間了。

C 拷貝建構函式的呼叫

拷貝建構函式主要在以下三種情況下起初始化作用 1.在宣告語句中用乙個物件初始化另乙個物件 2.將乙個物件作為引數按值呼叫方式傳遞給另乙個物件時生成物件副本 3.生成乙個臨時物件作為函式的返回結果。這種情況只有在windwos下是真的,我只是在windos xp vc 6.0 以下面的 為例 incl...

呼叫C 複製建構函式和拷貝建構函式

呼叫c 複製建構函式和拷貝建構函式 1.何時呼叫複製建構函式 複製建構函式用於將乙個物件複製到新建立的物件中。也就是說,它用於初始化過程中,而不是常規的賦值過程中。類的複製建構函式原型通常如下 class name const class name 它接受乙個指向類物件的常量引用作為引數。例如,st...

C 建構函式 析構函式和拷貝構造的呼叫

建構函式是在建立給定型別的物件時執行的類方法。建構函式具有與類相同的名稱,它通常初始化新物件的資料成員。析構函式 destructor 與建構函式相反,當物件結束其生命週期,如物件所在的函式已呼叫完畢時,系統自動執行析構函式。析構函式往往用來做 清理善後 的工作。拷貝建構函式是一種特殊的建構函式,其...