閱讀291 返回首頁    go 技術社區[雲棲]


《C++覆轍錄》——1.9:使用糟糕的語言

本節書摘來自異步社區出版社《C++覆轍錄》一書中的第1章,第1.9節,作者: 【美】Stephen C. Dewhurst(史蒂芬 C. 杜赫斯特),更多章節內容可以訪問雲棲社區“異步社區”公眾號查看。

1.9:使用糟糕的語言

當一個更大的世界入侵了C++社群原本悠然自得的樂土之時,它們帶來了一些足堪天譴的語言和編碼實踐。本節乃是為了厘清返璞歸真的C++語言所使用的正確適當、堪稱典範之用語和行為。

用語
表1-1列出了最常見的用語錯誤,以及它們對應的正確形式。

表1-1 常見用語錯誤及其對應正確用語

0253e977f2ccbddb6f1047be7cfce0428cbddaf1

沒有什麼所謂“純虛基類”。純虛函數是有的,而包含有或是未能改寫(override)此種函數的類,我們並不叫它“純虛基類”,而是叫它“抽象類”。

C++語言中是沒有“方法”的。JavaSmalltalk裏才有方法一說。當你頗帶著一絲自命不凡地就麵向對象的話題侃侃而談之時,你可能使用像“消息”和“方法”這種用語。但如果你開始腳踏實地,開始討論你的設計對應的C++實現時,最好還是使用“函數調用”或“成員函數”來表達。

還有一些不足為信的C++專家(是在說你嗎?)使用“destructed”作為“constructed”的對應詞。這明顯是英語沒學好35,正確的對應詞是“destroyed”。

C++ 語言中確實有強製型別轉換(或曰型別轉換)運算符——事實上隻有4個(static_castdynamic_castconst_cast以及reinterpret_cast)。遺憾的是,“強製型別轉換運算符”常常被不正確地用於表達“成員型別轉換運算符”,而後者指定了某種對象何以被隱式地轉換到另外的型別。

class C {
  operator int *()const; // 成員型別轉換運算符
  //...
};```
當然用強製轉換運算符來完成型別轉換的工作也是允許的,隻要你不把用語搞混就成。

請參見常見錯誤31中有關“常量指針”和“指涉到常量的指針”的討論,以加深對本主題的理解。

空指針
從前,當軟件工程師使用預處理符號`NULL`來表示空指針時,他會遭遇潛在的災難:

void doIt( char * );
void doIt( void * );
C *cp = NULL;```
麻煩出在NULL這個符號在不同的平台上,有很多種定義的方法:

#define NULL ((char *)0)
#define NULL ((void *)0)
#define NULL 0```
這些各掃門前雪的不同定義嚴重損害了C++語言的可移植性:

doIt( NULL ); // 平台相關抑或模棱兩可?
C *cp = NULL; // 錯誤?``
事實上,在C++語言裏是沒有辦法直接表示空指針的。但我們可以保證的是,數字字麵常量0可以轉換成任何一種指針型別對應的空指針。那也就是傳統的C++語言保證可移植性和正確性的用法36。現在,C++標準規定像(void *)0這樣的定義是不允許的37,可見這是個和
NULL的使用並無多大幹係的技術問題(如若不然,NULL`豈不是成了格外受人青睞的預處理符號?其實它是普通不過的)。可是,真正領會了C++語言精神的軟件工程師仍然使用字麵常量038。任何其他用法都會使你顯得相當非主流。

縮略詞
C++軟件工程師都有縮略詞強迫症,不過與管理層相比,可謂小巫見大巫。表1-2在你的同事給你來上一句“RVO將不會應用到POD上,所以你最好自己寫個自定義的複製ctor”時能派上用場。

表1-2 常用縮略詞的意思

3d914fe90ba47faef017e1350da0164d5c91bafe

最後更新:2017-06-06 07:36:30

  上一篇:go  關於雲棲TechDay
  下一篇:go  《第一本Docker書(修訂版)》——2.4 在OS X中安裝Docker Toolbox