第七章 7 5 4節練習

2021-06-26 11:09:29 字數 1530 閱讀 4624

練習7.47

說明接受乙個string引數sales_data建構函式是否應該是explicit的,並解釋這樣做的優缺點。

解答:應該宣告成explicit,這樣做能讓物件構造的更加明確。

缺點可能就是,在構造物件的時候,不注意會出現莫名的錯誤。

練習7.48

假定sales_data的建構函式不是explicit的,則下述定義將執行什麼樣的操作?

string null_isbn("9-999-99999-9");

sales_data item1(null_isbn);

sales_data item2("9-999-99999-9");

如果sales_data的建構函式是explicit的,又會發生什麼呢?

解答:1) 初始化乙個sales_data類物件,使其bookno為「9-999-99999-9」。

然後,使用編譯器生成預設拷貝建構函式來初始化item1.

item2的生成與null_isbn一樣。

2) 這裡也是顯式的使用string引數的建構函式,所以不會出現別的問題。

等價測試:

#include using namespace std;

class a

string data;

};int main()

練習7.49

對於combine函式的三種不同宣告,當我們呼叫i.combine(s)時分別發生什麼情況?其中i是乙個sales_data,而s是乙個string物件。

(a) sales_data &combine(sales_data);

(b) sales_data &combine(sales_data&);

(c) sales_data &combine(const sales_data&) const;

解答:

#include using namespace std;

class a

a &afun(a a){}

a &bfun(a& a){}

a &cfun(const a& a)const{}

string data;

};int main()

以上是等價測試用例。

基本上都是乙個錯誤,string型別無法向目標型別進行轉換。

練習7.50

確定在你的person類中是否也有一些建構函式應該是explicit的。

解答:這個應該也是需要,比如說用名字進行構造之類的。

練習7.51

vector將其單引數的建構函式定義成explicit的,而string則不是,你覺得原因何在?

解答:應該是為了方便理解,所以新增了這樣的設定。

因為vector接受乙個容量引數的建構函式如果不是explicit的,那麼就允許這樣初始化:vectorivec = 10;

意思就是初始化ivec為10個0,這樣太讓人迷惑了。所以定義成explicit比較好,不允許這樣的寫法。但是string s = "aaa"還是很好理解的。

引用:

第七章 7 2節練習

練習7.16 在類的定義中對於訪問說明符出現的位置的次數由限定嗎?如果有是什麼?什麼樣的成員應該定義在public說明符之後,什麼樣的成員應該定義在private說明之後?解答 對次數和位置沒有嚴格的限制。簡單來說,想讓外部訪問到的成員應該定義在public之後,不想讓外部訪問的到的成員應該定義在p...

第七章 7 3 2節練習

練習7.27 給你自己的screen類新增move set和display函式,通過指向下面的 檢驗你的類是否正確。screen myscreen 5,5,x myscreen.move 4.0 set display cout cout n myscreen.display cout cout n...

第七章 7 5 3節練習

7.5.2節的練習,可以自行選擇練習。練習7.43 假定有乙個名為nodefault的類,它有乙個接受int的建構函式,但是沒有預設建構函式。定義類c,c有乙個nodefault型別的成員,定義c的預設建構函式。解答 struct nodefault int data struct c nodefa...