本節書摘來自異步社群出版社《c++程式設計慣用法——進階程式員常用方法和技巧》一書中的第2章,第2.11節,作者: 【美】robert b. murray ,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
1.複制構造函數x::x(x)在c++中是非法的。請解釋其原因。
2.我們的string類的構造函數通過調用
來為它的資料擷取存儲空間。不過在字元串中隻有strlen(cp)個字元,那麼多出來的那個字元是做什麼用的呢?
3.我們的file類假設所有的file對象都表示一個唯一的檔案描述符——對一個file進行複制會産生一個新的描述符。假設我們希望複制一個file對象時隻産生一個和該對象共享已有描述符的對象——也就是說這個新的對象不會對已有描述符的數目進行遞增。我們應該如何修改file類來達到這個目的呢?(提示:僅僅不讓複制構造函數去修改那個計數器是不夠的。)
4.一個編譯器制造商可能是為了節省開發成本,沒有去實作内嵌的展開:也就是說,所有的對于内嵌函數的調用都會被解釋為一次真正的函數調用。對于c++來說,這樣做是合法的,但對于使用該編譯器的使用者來說,這樣做可能會是一場災難。為什麼?
5.有個程式員可能希望為double和rational的任意組合提供一個加法操作符。請為他提出兩種解決方案,并對它們的優缺點做出評價。
6.向上題中的加法操作增添對complex的支援并重複上題中的讨論。
7.為我們已有的complex類(使用了極坐标表示)實作設定其(笛卡兒坐标系中的)實部和虛部的函數。
8.我們的complex類中用來設定其實部和虛部的函數的傳回值是void。我們可以把它們的傳回值改成什麼樣才有意義呢?是否存在着其他的答案可以使得問題更加清楚?如果沒有的話,你會建議使用哪種方法呢?
9.假設我們正在使用string類,它提供了一個operator const char*的轉換函數:
再假設我們有一個函數remove_blanks,它帶有一個類型為char*的參數,我們用它來去除它的參數所指向的字元串中的空格:
最後假設有個使用者,他試圖用這個函數來去除掉一個string對象中的所有空格,為的是将這個string對象變短,而不是變長:
請問他這樣做安全嗎?為什麼?
10.下面的類中有什麼錯誤?
我們應該如何更改它的接口來修正這個問題?
[1]譯注:在這作者顯得有點樂觀,他假設修改類的開發人員會去認真地閱讀頭檔案中的注釋,隻有在讀過頭檔案中的注釋并正确了解其中意義的前提下,我們才可能得到作者所期望得到的結果。
[2]如果我們使用的編譯器支援異常,那麼它應該抛出一個異常(詳見第10章),而不是退出函數。
[3]譯注:此處的向量是幾何中的向量,而不是像标準庫中那樣用于表達一個數組的向量。
[4]譯注:即va_start、va_list以及va_end。
[5]譯注:即所謂的nvo。
本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。