淺談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];//把原來陣列中的元素複製過來。
}