本篇講述以上兩種預設函式
我們可以建立乙個物件,那麼能否再建立乙個和這個物件一模一樣的的新的物件呢?這就引入了拷貝建構函式
拷貝建構函式與之前講的建構函式一樣,函式名為類名,當用已存在的類型別的物件建立新的物件時,編譯器會自動呼叫拷貝建構函式。
class a1
private:
int _a;
double _b;};
intmain()
上面我們沒有顯式的定義出拷貝建構函式,若要顯式定義,如下:
class a1a1(
const a1& a)//拷貝建構函式,需要通過引用傳值,否則會一直呼叫拷貝函式進入死遞迴
private:
int _a;
double _b;};
intmain()
這裡的的預設拷貝建構函式,是一種淺拷貝(以後會講到),資源是拷貝不過去的。
總結:1.拷貝建構函式是建構函式的乙個過載形式。
2.拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。
3.若未顯示定義,系統生成預設的拷貝建構函式。 預設的拷貝建構函式物件按記憶體儲存按位元組序完成拷貝,這種拷貝稱為淺拷貝,或者值拷貝。
4.如果涉及到資源的拷貝,便需要我們自己顯式定義拷貝建構函式,完成資源的拷貝。
5.建議在引用前加上const保證可以使用臨時物件進行拷貝
如果,我們要判斷兩個物件是否相等,可以如下:
class a1
bool isequal
(const a1& a)
//判斷是否相等
private:
int _a;
double _b;};
intmain()
b.isequal(a)寫的話,**的可讀性並不是很高,如果寫成a==b的話,那麼便一目了然的知道是判斷是否相等。因此,這裡引入運算子過載函式運算子過載函式:
c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值類 型,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似
函式名字為:關鍵字operator後面接需要過載的運算子符號。
函式原型:返回值型別 operator操作符(引數列表)
例如將上述比較物件是否相等的函式寫為運算子過載函式如下:
class a1
bool operator==
(const a1& a)
// bool isequal(const a1& a)
// private:
int _a;
double _b;};
intmain()
這裡的bool operator==(const a1& a)是有兩個引數的,只不過第乙個引數是呼叫者的this指標,即左運算元是this指向的呼叫函式的物件。
當然還有以下這種定義方式:
class a1
bool operator==
(const a1& a,
const a1& b)
// bool isequal(const a1& a)
// //private:
int _a;
double _b;};
intmain()
這是定義的全域性的operator==因此,需要時成員變數是公有的,如果還想要保持封裝性的話,就需要用到我們後面學習的友元解決,再比如我們定義乙個求兩數的和:
class a1
int operator+
(const a1& a)
//求兩數和
private:
int _a;
double _b;};
intmain()
結果如圖
總結:1.不能通過連線其他符號來建立新的操作符:比如operator@
2.過載操作符必須有乙個類型別或者列舉型別的運算元
3.用於內建型別的操作符,其含義不能改變,例如:內建的整型+,不 能改變其含義
4.作為類成員的過載函式時,其形參看起來比運算元數目少1,成員函式的操作符有乙個預設的形參this,限定為第乙個形參
5.』*』 、』::』 、『sizeof』 、』?:』 、』.』 注意以上5個運算子不能過載.
賦值運算子過載
之前我們用建構函式或拷貝函式給另物件賦值,這裡我們可以通過運算子來賦值,比如:
class a1
//運算子賦值過載函式
//預設返回的是*this
const a1& operator=
(const a1 &a)
return
*this;
}void
display()
private:
int _a;
double _b;};
intmain()
列印結果如圖:
注意:1.=呼叫:如果物件都存在,呼叫賦值運算子過載函式, 如果左邊物件不存在,呼叫拷貝構造
2.返回值為引用型別
3.預設返回*this
4.乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的值拷貝。
比如:
class a1
void
display()
private:
int _a;
double _b;};
intmain()
C 類物件的拷貝建構函式
c 類物件的拷貝建構函式 不祥 閱讀人次 條 對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 100 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。include using namespace std cl...
基礎 C 的拷貝構造和析構函式以及深淺拷貝
4.2.2 建構函式的分類及呼叫 4.2.3 拷貝構造函式呼叫時機 4.2.4 構造函式呼叫規則 4.2.5 深拷貝與淺拷貝 4.2.6 初始化列表 4.2.8 靜態成員 物件的初始化和清理也是兩個非常重要的安全問題 乙個物件或者變數沒有初始狀態,對其使用後果是未知 同樣的使用完乙個物件或變數,沒有...
C 類物件的複製 拷貝建構函式
在學習這一章內容前我們已經學習過了類的建構函式和析構函式的相關知識,對於普通型別的物件來說,他們之間的複製是很簡單的,例如 int a 10 int b a 自己定義的類的物件同樣是物件,誰也不能阻止我們用以下的方式進行複製,例如 include using namespace std class ...