練習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...