C Primer(5e)第13章習題

2021-09-18 04:29:56 字數 3585 閱讀 2454

如果乙個建構函式的第乙個引數是自身類型別的引用,且任何額外引數都有預設值,則此建構函式是拷貝建構函式。

使用時候:

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.函式的返回值不能是陣列型別或函式型別,但...