關於拷貝建構函式

2021-05-10 16:20:38 字數 1343 閱讀 7798

首先不要使用vc編譯器來測試,看看這段**並猜想它會呼叫幾次建構函式和析構函式,最後再測試一下:

在vc編譯執行後結果大失所望吧?不明白不要緊,vc這個整合的ide開發工具它的「博大精深」值得我們慢慢學習與積累,先看看下面我查詢的資料吧:

一、拷貝建構函式

拷貝建構函式,是一種特殊的建構函式,它由編譯器呼叫來完成一些基於同一類的其他物件的構建及初始化。其唯一的引數(物件的引用)是不可變的(const型別)。此函式經常用在函式呼叫時使用者定義型別的值傳遞及返回。拷貝建構函式要呼叫基類的拷貝建構函式和成員函式。如果可以的話,它將用常量方式呼叫,另外,也可以用非常量方式呼叫。

在c++中,下面三種物件需要呼叫拷貝建構函式:

1) 乙個物件以值傳遞的方式傳入函式體;

2) 乙個物件以值傳遞的方式從函式返回;

3) 乙個物件需要通過另外乙個物件進行初始化;

如果在前兩種情況不使用拷貝建構函式的時候,就會導致乙個指標指向已經被刪除的記憶體空間。對於第三種情況來說,初始化和賦值的不同含義是構造函式呼叫的原因。事實上,

拷貝建構函式是由普通建構函式和賦值操作符共同實現的。描述拷貝建構函式和賦值運算子的異同的參考資料有很多。

拷貝建構函式不可以改變它所引用的物件,其原因如下:當乙個物件以傳遞值的方式傳乙個函式的時候,拷貝建構函式自動的被呼叫來生成函式中的物件。如果乙個物件是被傳入自己的拷貝建構函式,它的拷貝建構函式將會被呼叫來拷貝這個物件這樣複製才可以傳入它自己的拷貝建構函式,這會導致無限迴圈直至棧溢位(stack overflow)。除了當物件傳入函式的時候被隱式呼叫以外,拷貝建構函式在物件被函式返回的時候也同樣的被呼叫。

如果在類中沒有顯式的宣告乙個拷貝建構函式,那麼,編譯器會自動生成乙個來進行物件之間的位拷貝(bitwise copy)。這個隱含的拷貝建構函式簡單的關聯了所有的類成員。注意到這個隱式的拷貝建構函式和顯式宣告的拷貝建構函式的不同在於對成員的關聯方式。顯式宣告的拷貝建構函式關聯的只是被例項化的類成員的預設建構函式,除非另外乙個建構函式在類初始化或構造列表的時候被呼叫。

拷貝建構函式使程式更有效率,因為它不用再構造乙個物件的時候改變建構函式的引數列表。設計拷貝建構函式是乙個良好的風格,即使是編譯系統會自動為你生成預設拷貝建構函式。事實上,預設拷貝建構函式可以應付許多情況。

上述開篇的那段**,因為它並不只是唯一的乙個建構函式(實際上呼叫了四次拷貝建構函式),所以你可以顯式的宣告乙個拷貝建構函式再編譯試試,**如下:

二、程式執行效果:

cedric moonen

pallini

codeproject

關於拷貝建構函式

1 乙個物件用於給另外乙個物件進行初始化 賦值初始化 2 乙個物件作為函式引數,以值傳遞的方式傳入函式體 3 乙個物件作為函式返回值,以值傳遞的方式從函式返回 原則 對於凡是包含動態分配成員或包含指標成員的類都應該提供拷貝建構函式 對於第一種情況,先用乙個例子進行以下的說明 這個類的主要特點是包含指...

關於構造,析構,拷貝建構函式,

1.建構函式 2.析構函式 3.拷貝建構函式 4.賦值語句 5.位址過載運算子 取址符 6.對const取物件的位址符 一.建構函式 1.關鍵字explicit 在建構函式前加上explicit時建構函式必須顯示呼叫 例如test是類名,有乙個test的建構函式,有兩個引數。若果加上關鍵字expli...

拷貝建構函式,預設拷貝建構函式

拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...