從一例子解析合成拷貝建構函式和拷貝建構函式

2021-08-17 22:20:42 字數 1252 閱讀 4580

1:假定numbered是乙個類,它有乙個預設建構函式,能為每個物件生成乙個唯一的序號,儲存在名為mysn的資料成員中。假定numbered使用合成的拷貝建構函式成員,並給出如下函式:

void f(numbered s) ;

int numbered::seq = 0;

void f(numbered s)

從**中可以看出,如果使用合成的版本,則只會複製a的編號。則最後結果都為0 ,執行結果為。

這裡顯示呼叫了預設建構函式是因為numbered a,則呼叫了預設建構函式,後面b=a,c=b是呼叫了合成的拷貝建構函式,所以輸出為0

#include

using

namespace

std;

class numbered

;int numbered::seq = 0;

numbered::numbered(const numbered &s)

執行結果:

這裡第乙個輸出呼叫了預設建構函式是因為申明了乙個a,b=a,c=b這裡呼叫了拷貝建構函式,但是為什麼又出現了一次呼叫了拷貝建構函式呢??因為呼叫f(a)的時候,因為f(numbered s),形參不是引用,所以要呼叫拷貝建構函式將a的值賦值給s,所以輸出的值就是3 ,而不是0,同理得到4 5

3:如果引數f中的引數為const numbered &,結果將會怎樣,**為:

#include

using

namespace

std;

class numbered

;int numbered::seq = 0;

numbered::numbered(const numbered &s)

執行結果為:

這裡為什麼少了3次呼叫了拷貝建構函式呢??因為f裡的引數是引用,所以不需要呼叫拷貝建構函式,故最後mysn的值為0,1,2。

相信解釋了這些就可以理解合成拷貝建構函式和拷貝建構函式了。。

拷貝建構函式和深拷貝例子

1.拷貝建構函式也是乙個建構函式,用來構造物件,只有在物件定義時起作用,其第乙個引數是自身型別的引用,其他任何引數均帶有預設值.如果第乙個引數不是引用型別,因為構造拷貝物件時必須呼叫拷貝建構函式,那麼連拷貝建構函式都必須呼叫拷貝建構函式,結果可想而知,呼叫永遠也不會成功 2.如果我們沒有為乙個類定義...

拷貝建構函式和深拷貝例子

1.拷貝建構函式也是乙個建構函式,用來構造物件,只有在物件定義時起作用,其第乙個引數是自身型別的引用,其他任何引數均帶有預設值.如果第乙個引數不是引用型別,因為構造拷貝物件時必須呼叫拷貝建構函式,那麼連拷貝建構函式都必須呼叫拷貝建構函式,結果可想而知,呼叫永遠也不會成功 2.如果我們沒有為乙個類定義...

拷貝建構函式和移動建構函式解析

by gongzhihui 2017.12.5 拷貝構造函式呼叫時機 1.物件作為函式引數 2.物件作為函式返回值 3.用乙個物件初始化另乙個物件 t t1 t t2 ti t t3 t1 此處的 不是賦值運算子 拷貝賦值運算子 t t1 t t2 t1 t2 除了 類名 物件 物件 外的 應該都是...