如果乙個建構函式的第乙個引數是自身類型別的引用,且任何額外引數都有預設值,則此建構函式是拷貝建構函式。
使用時候:
1.用=定義變數
2.將要給物件作為實參傳遞給乙個非引用型別的實參
3.從乙個返回型別為非引用型別的函式返回乙個物件
4.用花括號列表初始化乙個陣列中的元素或乙個聚合類中的成員
因為如果拷貝建構函式的引數不是引用型別,則調動永遠也不會成功:為了呼叫拷貝建構函式,我們必須拷貝它的實參,但為了拷貝實參,我們又需要呼叫拷貝建構函式,如此無限迴圈。
拷貝其中的資源和物件;拷貝其中的指標。
都使用了拷貝建構函式
hasptr
(hasptr& hp)
拷貝賦值運算子就是接受乙個與其所在類相同型別的引數,返回乙個指向其左側運算物件的引用並名為operator=的函式;當使用=運算子時使用該函式; 合成拷貝賦值運演算法類似拷貝建構函式;如果乙個類未定義自己的拷貝賦值運算子,編譯器會為它生成乙個合成拷貝賦值運算子。
賦值其中的資源和物件; 賦值其中的指標物件
hasptr& operator=
(const hasptr& hp)
析構函式是類的乙個成員函式,名字由波浪號接類名構成,它沒有返回值,也不接受引數;
合成析構函式被用來阻止該型別的物件被銷毀;
當乙個類未定義自己的析構函式時,編譯器會為它定義乙個合成析構函式
析構函式執行;
析構函式不會執行
~
hasptr()
3次
struct x
;
都輸出同樣的內容
會改變,拷貝建構函式生成的序號獨一無二
如果類中有拷貝建構函式,則結果會改變;如果沒有,則結果不變
/* 練習13.14 */
#include
using namespace std;
class numbered};
void
f(numbered s)
intmain()
/* 練習13.15 */
#include
using namespace std;
class numbered};
void
f(numbered s)
intmain()
/* 13.16 */
#include
using namespace std;
class numbered};
voidf(
const numbered s)
intmain()
class employee
employee
(string n)
:name
(n), id (num++
)private:
int id;
static
int num;
string name;};
int employee:
:num =
0;
需要,我們需要獨一無二的證號
class employee
employee
(string n)
:name
(n), id (num++
)employee
(const employee &ep)
employee& operator=
(const employee &ep)
private:
int id;
static
int num;
string name;};
int employee:
:num =
0;
class hasptr
hasptr
(const hasptr &p):ps
(new string
(*p.ps)),
i(p.i)
hasptr& operator=
(const hasptr &hp)
~hasptr()
private:
string *ps;
int i;
};
未定義析構函式:記憶體洩漏
未定義拷貝建構函式:多次釋放同一指標資源
/* 書上例子敲一遍也是極好的 */
class hasptr
hasptr
(const hasptr &p):ps
(p.ps),i
(p.i)
,use
(p.use)
hasptr& operator=
(const hasptr);~
hasptr()
;private:
string *ps;
int i;
size_t *use;};
hasptr::~
hasptr()
}hasptr& hasptr:
:operator=
(const hasptr &rhs)
ps = rhs.ps;
i = rhs.i;
use = rhs.use;
return
*this;
}
/* a選項 */
class treenode
treenode
(treenode &tn)
treenode& operator=
(treenode &tn)
count = tn.count;
value = tn.value;
left = tn.left;
right = tn.right;}~
treenode()
if(right)}}
private:
string value;
int count;
treenode *left;
treenode *right;
size_t *use;};
/* b選項 */
class binstrtree
binstrtree
(binstrtree &bst)
binstrtree& operator=
(binstrtree& bst)
~binstrtree()
private:
treenode *root;
};
交換了指標,而不是指標所指的資料
void
swap
(hasptr &lhs, hasptr &rhs)
不會,類指標的hasptr版本不用分配動態記憶體 c primer, 5e 函式指標
簡單的示例 include using namespace std int sum int x,int y int main 遇到過載的情況,編譯器通過指標型別精確匹配函式。include using namespace std int sum int x,int y int sum int x,d...
c primer, 5e 函式匹配
練習 6.49 候選函式 與所呼叫的函式的名字相同的函式的集合。可行函式 給候選函式加上引數數量 引數型別的約束所得到的函式的集合。6.50 a 3 4可行,二義匹配 b 2 4可行,2是最佳匹配 c 3 4可行,3是最佳匹配 d 3 4可行,4是最佳匹配 6.51 測試 include using...
《C Primer 5e》學習筆記(5) 函式
1.函式的呼叫完成兩項工作 一是用實參初始化函式對應的形參,二是將控制權轉移給被呼叫的函式。此時,主調函式的執行被暫時中斷,被調函式開始執行。2.函式定義規定了實參與形參存在的對應關係,但是並沒有規定實參的求值順序。編譯器能以任意可行的順序對形參進行求值。3.函式的返回值不能是陣列型別或函式型別,但...