1. 程式人生 > >淺談c++中的複製建構函式

淺談c++中的複製建構函式

3. 複製建構函式

3.1 複製建構函式作用

    它是一種特殊的建構函式,其形參為本類物件的引用。作用是用一個已存在的物件去初始化同類型的新物件。

3.2 宣告和實現複製建構函式的一般方法

Class Clock{

Public:

Clock(int newH,int newM,int newS);//建構函式

Clock(const Clock &a); //複製建構函式宣告

...........

Private:

    Int x,y;

Clock::Clock(const Clock &a){ // 複製建構函式的實現。

x=a.x;

y=a.y;

}

3.3 呼叫複製建構函式的三種情況

(1)定義一個物件時,以本類另一個物件作為初始值,發生複製構造;

(2)如果函式的形參是類的物件,呼叫函式時,將使用實參對其初始化,發生複製構造。

(3)如果函式的返回值是類的物件,函式執行完成返回主調函式時,將使用return語句中的物件初始化一個臨時無名物件,傳遞給主調函式,此時發生複製構造。

例如:

Class Point{

Public:

Point(int xx=0, int yy=0){x=xx;y=yy;}//建構函式

Point(const Point &P);//複製建構函式

..........

}

//形參為Point類物件的函式

Void fun1(point P){

    Cout<<p.getX()<<endl;

}

//返回值為point類物件的函式

Point fun2(){

Point a(1,2);

return a;

}

//主程式

int main(){

Point a(4,5); //第一個物件A

Point b(a); //情況一,用A初始化B。第一次呼叫複製建構函式

cout<<b.getX()<<endl;

fun1(b); // 情況二,物件B作為fun1的實參。第二次呼叫複製建構函式

b=fun2(); //情況三,函式的返回值是類的物件,函式返回時呼叫複製構造函

cout<< b.getX()<<endl;

return 0;

}

3.4 隱含的複製建構函式

如果程式設計師沒有為類聲明覆制建構函式,則編譯器自己生成一個隱含的複製建構函式。

這個隱含的複製建構函式的作用:為初始值的物件的每個資料成員的值,初始化將要建立物件的資料成員。

3.5 為什麼要複製建構函式

肯定不會原樣複製,可能複製物件和原物件並不一樣的。不是一一對應複製,可能有偏移。這樣的話預設的複製建構函式就沒用了,自己來聲明覆制建構函式。這裡考慮深層複製建構函式。

3.6淺拷貝缺點

    (1)淺拷貝只是複製了指標,也就是說兩個指標指向同一塊記憶體,通過一個指標訪問這塊記憶體並進行改變,那麼用第二個指標可以觀察到物件是變化的。所以淺拷貝後這兩個物件不是獨立的。 

(2)淺拷貝後,對物件進行析構,會對一塊記憶體析構兩次,所以會產生錯誤。

3.6深拷貝怎麼實現

指標拷貝的同時,也要拷貝指向的記憶體區的資料。做到兩塊記憶體相互獨立。

例子:

Arrayofpoints::Arrayofpoints(const Arrryofpoints & v){

Size = v.size; //引數物件的size複製到當前物件的size

Points = new Point[size];//首地址不能直接複製,先分配記憶體空間,構建新數

                    //組。

for(int i = 0;i<size;i++)

    Points[i] = v.points[i];//把原來陣列中的元素複製過來。

}