天天看點

《C++ Templates中文版》——1.4 關于程式設計風格的一些說明

本節書摘來自異步社群出版社《c++ templates中文版》一書中的第1章,第1.4節,作者: 【美】david vandevoorde , 【德】nicolai m. josuttis,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++程式員的程式設計風格通常是互不相同的,我們也不例外:風格所涉及的問題包括在哪裡加入分隔符、界定符(花括号、圓括号)等。我們會盡量保持一緻的風格,但就目前的一些(特殊的)話題,偶爾也會有所例外。例如,在教程這一部分(第1部分),我們使用了大量的空格和具體的名稱,是為了令代碼更加形象;而在進階話題讨論部分(第4部分),我們就使用了比較緊湊的風格,這樣顯得更加适合話題的讨論。

關于“類型、參數、變量”的聲明,我們希望你能注意一些稍微特殊的用法。顯然,下面幾種風格都是可能的:

對“常整數”而言,上面的幾種用法雖然差别不大,但我們趨向于使用int const,而不使用const int。作出這個選擇,主要有兩個原因:首先,針對問題“什麼是恒定不變的”,int const提供了很容易了解的答案。實際上,“恒定不變部分”指的是const限定符前面的部分。例如,盡管

等價于:

但是對于:

卻沒有相應的等價形式(就是說如果把const限定符放在運算符*的前面,與前者并不等價)。在這個例子中,我們隻是說明了指針本身是個常量,而并沒有說明這個int值(即指針指向的值)是個常量。

第2個原因涉及到使用模闆時一個很常用的文法替換原則。考慮下面的兩個類型定義[1]:

當我們用chars所代表的含義對它進行替換之後,第2個聲明的含義是不變的:

然而,如果我們把const放在它所限定的類型的前面,那麼這個原則就不再适用了。針對我們前面給出的兩個類型聲明,考慮下面的替換代碼:

但如果我們替換掉chars之後,第2個聲明卻會導緻不同的含義:

當然,同樣的現象(規則)也适用于volatile限定符。

對于間隔符,我們決定在 & 符号和參數名稱之間留出一個空格:

借助這種方法,我們同時也強調了:參數類型和參數名稱是分離的。

顯然,諸如下面的聲明更容易令人混淆:

上面代碼中,如果根據c語言的規則,a是一個指針,而b是一個char類型的普通變量。為了避免産生這種混淆,我們盡量不在同一個語句中聲明多個實體。

雖然這并不是一本介紹c++标準庫的書,但我們在很多例子中都會用到标準庫。在很多情況下,我們都使用了c++的特定頭檔案(例如我們使用< iostream >,而不是< stdio.h >)。唯一的例外情況是< stddef.h >,我們趨向于使用這個頭檔案,而不使用< cstddef >,進而也就不用給size_t和ptrdiff_t添加std:: 名字空間限定;另外,< stddef.h >具有更好的可移植性;而且,使用std::size_t替換size_t并不能得到任何好處。

繼續閱讀