7.1
View Code
7.2
7.3
7.4&7.5
應該是cosnt成員函數,在這兩個函數體内不應該修改成員資料的值。
7.6&7.7
7.8
read函數:從給定的流中将資料讀到給定的對象裡(可能函數裡有要改變對象的值的操作)
print函數:将給定對象的内容列印到給定的流中(直接列印對象的内容,無需改變對象的值)
7.9
條件部分的作用:連續輸入兩次資料
7.11
7.12
7.13
7.14
7.15
7.16
沒有特别的位置與次數限制
public成員定義類的接口
private成員封裝(隐藏)了類的實作細節
7.17
有差別,class預設是private,struct預設是public
7.18
封裝是把類的資料成員與接口分離,實作對資料的隐藏和保護。封裝可以防止使用者在不經意間對類資料的改變,封裝好的類可以直接讓别的使用者直接使用,就像基本類型一樣,而不需要使用者對代碼的修改。
友元的用處:允許其他類或函數通路本類的非公有成員
使用友元的好處:可以使一些非本類的成員函數能通路到類的非公有成員;
缺點是:破壞了類的封裝、可維護性、可靠性。
7.21
7.22
7.23
7.24
7.25
能,因為Screen的資料成員都是自帶拷貝或指派相關的函數。
7.26
7.27
7.28
第二個display将列印一片X,沒有#,原因是傳回的不是引用,這樣在myScreen調用move傳回的是一個對象,這個對象已經和myScreen沒關系了。
優點:可以非常明确地指出通路的是調用該函數的對象的成員,且可以在成員函數中使用與資料成員同名的形參
缺點:太多餘了
7.31
7.32
7.33
編譯器報錯:[Error] 'pos' does not name a type
修正:指定size函數的傳回類型是屬于哪個類,即
7.34
會導緻編譯出錯,因為對 pos 的使用出現在它的聲明之前,此時編譯器并不知道pos到底是什麼含義。
7.35
Type使用的是類内的定義;類外的initVal的傳回類型是string,類内的initVal的傳回類型是double。
代碼存在錯誤,修正後:
7.36
rem應先被定義:
7.37
7.38
7.39
不合法,因為存在多個預設構造函數。
7.40
Book,構造函數如下:
7.41
7.42
7.43
7.44
非法,因為NoDefault沒有預設構造函數
7.45
合法,C有預設構造函數
7.46
a 錯誤:可以不提供構造函數,此時會自動生成一個預設構造函數
b 錯誤:帶預設參數構造函數也是預設構造函數
c 錯誤:就算怎麼無意義,也最好提供一個預設值
d 錯誤:在不定義任何構造函數的情況下才會自動提供一個預設的構造函數
7.47
這個随便,因為這是一把雙刃劍
不帶explicit的優點:可以從構造函數的參數類型向類類型隐式轉換
帶explicit的優點:任何構造函數(尤其是帶一個參數的)都不能隐式地建立類對象
帶explicit的缺點:該構造函數隻能以直接初始化的形式使用
7.48
第一行建立了一個string對象,第二行和第三行都是調用Sales_data的構造函數
不是explicit時:
item1對象會被成功建立
item2對象也會被成功建立
是explicit時:
item1對象會被成功建立(因為直接初始化)
item2對象也會被成功建立(同上)
7.49
(a)合法
(b)不合法,Salesdata &類型與Salesdata類型之間不可轉換
(c)不合法,把combine聲明成了常量成員函數,是以該函數無法修改資料成員的值
7.51
string接受的單參數是const char*類型,如果我們得到了一個常量指針,則把它看做string對象是自然而然的過程,編譯器自動把參數類型轉換成類類型也非常符合邏輯,是以我們無須指定為explicit。
與string相反,vector接受的單參數是int類型,這個參數的原意是指定vector的容量。如果我們在本來需要vector的地方提供一個int值并且希望這個int值自動轉換成vector,則這個過程顯得比較牽強,是以把vector的單參數構造函數定義成explicit的更加合理。
例如:定義為explicit是為了防止隐式的類型轉換
7.52
"978-0590353403"初始化bookNo成員;
25初始化units_sold成員;
15.99初始化revenue成員。
7.53
7.54
不應該,因為constexpr函數必須傳回值
7.55
是的,首先它是一個聚合類,其次它的資料成員都是字面值類型
7.56
類的靜态成員:與類關聯在一起的成員
優點:存在于任何對象之外,讓所有對象共享(不需要在每個對象中都設定)
差別:靜态成員的類型可以是它所屬的類類型;可以使用靜态成員作為預設實參
7.57
7.58
類内進行了兩條靜态資料成員的初始化,而他們又并非常量類型,修改後: