物件的構造 析構 拷貝構造

2021-05-25 02:59:37 字數 583 閱讀 2871

這是一道外企的c++筆試題,要求寫出結果並分析:

#include

class a  

void  main()

a  a_1;

f(a_1);

3.當函式的返回值型別為類的物件的時候。 例如:

a  f()

a  a_1;

return a_1;

void  main()

a  a;

a = f();

當自己定義的類中沒有定義拷貝建構函式的時候,系統在需要呼叫拷貝建構函式的時候自動呼叫預設的拷貝建構函式。

這時候需要注意乙個問題:

當類的成員變數中有乙個指標變數,而在生成類物件後,物件的這個指標變數指向了一塊堆空間,這時候,如果使用這個物件去初始化乙個新的物件的時候,呼叫了預設的拷貝建構函式。這樣,兩個物件的指標都指向了同一塊對空間,如果類的析構函式裡對這個指標進行了delete操作,將導致這兩個物件析構的時候,同一塊堆空間被釋放兩次,進而出現錯誤。

這其實就是傳說中的物件的深拷貝和淺拷貝的問題,要解決這個問題,就要定義自己的拷貝建構函式,在複製物件中指向堆空間的指標的時候,申請新的堆空間,並進行內容的複製。

構造 析構 拷貝

析構函式 應用場景 淺拷貝 深拷貝 class person person int a 呼叫情況1.person p 呼叫了無參構造 person p 沒有呼叫了無參構造,呼叫情況2.person p1 new person 呼叫了無參構造 person p2 new person 呼叫了無參構造t...

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

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

建構函式 拷貝建構函式 析構函式

1.如果定義了兩個預設建構函式,vc只回給出warning.2.如果有預設引數的預設構造,如果你給了第乙個預設的話 所有傳遞引數都要有預設植 否則報錯.不過如果是第乙個引數的預設值沒有給出的話,編譯器卻看不出問題,但是沒有 試過這種情況建構函式能不能正常工作.建構函式 用來初始化物件的資料成員,與類...