1.前言
複製控制通常指類的複製建構函式
,賦值操作運算子
,析構函式
1.1複製建構函式
引入複製建構函式是為了讓類的物件直接生成另乙個物件
,同時把此物件的資料複製到另乙個物件中
如果類中沒有實現複製建構函式
,編譯器自動新增乙個
, 如果我們不需要
,則把它明確的禁止
,禁止方法是在
private
宣告乙個
2.定義
2.1複製建構函式的
2種方法實現
base(const base& org):x(org.x),y(org.y){} //
用初始化列表方式實現
base(const base& org) //
用傳統函式方式初始化成員
複製建構函式沒有返回值
,是一種特別的建構函式
,自動可以用建構函式的初始化列表示式
demo c(b); //
觸發呼叫複製建構函式
2.2賦值操作運算子
通過過載運算子
=,達到類的物件之間可以賦值功能
,簡化類物件的操作
但返回值必須有
this
指標的指向的引用
"*this"
b=c; //
觸發呼叫賦值操作運算子
2.3**例子:
#include
class demo
//無引數的建構函式
demo(int a1,int b1):x(a1),y(b1){}//
有預設值引數的建構函式
void setxy(int a=0,int b=0) //
修改x,y
成員void print() //
複製建構函式
demo& demo::operator=(const demo& rhs) //
賦值操作運算子
~demo(){}//
析構函式
protected:
int x;
int y;
};
class derived :public demo//
無引數的建構函式
derived(int a2,int b2,int c2):demo(a2,b2),z(c2){}//
有預設值引數的建構函式 //
重寫print()
void print() //
複製建構函式
?? derived& derived::operator=(const derived& rhs)//
賦值操作運算子
return *this;
} ~derived(){}//
析構函式
private:
int z;
};
int main()
//以上**用
vs2005
測試通過
3.基類與派生類
原則上基類複製控制由基類的成員函式完成
,派生類由派生類完成在派生類進行複製控制時
,要特別注意要把從基類繼承而來的成員也要初始化或者賦值
,因為名稱一樣
,它在派生類找到這個函式名稱後就不會再往上查詢基類的函式
,這直接引發派生類函式"覆蓋
"了基類的同名函式
,從基類往派生類產現來看
,又叫做派生類的函式"重寫
"結果我們的選擇
: 只能在派生類的複製控制函式加上呼叫基類的複製建構函式
只能在派生類的
賦值操作符加上呼叫基類的賦值操作符
3.1
派生類的複製建構函式實現
//基類
class derived :public demo;
4.設計指導
在基類的複製控制
:有乙個
"三實現"原則
,複製建構函式
,賦值運算子
,析構函式只要出現乙個
,就盡量實現三個在派生類的複製控制
,請直接呼叫基類的複製函式來實現不同的分工在派生類的析構函式只呼叫派生類
,基類也只呼叫基類的
摘自網際網路
C Primer筆記 13 複製控制
當定義乙個新型別的時候,需要顯式或隱式地指定複製 賦值和撤銷該型別的物件時會發生什麼 這就是通過定義特殊成員 複製建構函式 賦值操作符和析構函式來達到的。如果沒有顯式定義複製建構函式或賦值操作符,編譯器會為我們定義。複製建構函式 賦值操作符和析構函式總稱為複製控制 copy constrol 編譯器...
第13章 複製控制
複製建構函式 賦值操作符和析構函式總稱為複製控制 copy control 複製建構函式可用於 1 根據另乙個同型別的物件顯式或隱式初始化乙個物件 2 複製乙個物件,將它作為實參傳給乙個函式 3 從函式返回時複製乙個物件 4 初始化順序容器中的元素,如vectorsev 5 分別用了預設建構函式和複...
C rimer 學習筆記 ch13 複製控制
第十三章 複製控制 1.複製建構函式具有單個形參,該形參 常用const修飾 是對該類型別的引用,當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式,當將該型別的物件傳遞給函式或從函式返回該型別的物件時,將隱式使用複製建構函式 2.不管類是否定義了自己的析構函式,編譯器都自...