templates(0.1)
每一位 C++ 程序員都有自己的一套編程風格。這就引來了各種問題:哪兒應該 插入空白符號、怎么擺放分隔符(大括號、小括號)…等等。我們盡量保持全書風格一致, 當然有時候我們也對特殊問題作出讓步。例如在教本(初階)部份我們鼓勵以空白符號和較具體的命名方式提高程序可讀性,而在高階主題中,較緊湊的風格可能更加適宜。
我們有一個他人不太常用的習慣,用以聲明類型(types)、參數(parameters)和變量(variables), 希望你能多加注意。下面數種方式無疑都是合理的:
void foo (const int &x); void foo (const int& x); void foo (int const &x); void foo (int const& x);?
盡管較為罕見,我們還是決定在表達「固定不變的整數」(constant integer)時使用 int const而不寫成 const int。這么做有兩個原因,第一,這很容易顯現出「什么是不能變動的(what isconstant)」。不能變動的量總是 const 飾詞之前的那個東西。盡管以下兩式等價:
const int N = 100; //一般人可能的寫法
int const N = 100; //本書習慣寫法
但對以下述句來說就不存在所謂的等價形式了:
int* const bookmark; // 指針 bookmark 不能變動,但指針所指內容(int)可以變動
如果你把 const 飾詞放在運算符 * 之前,那就改變了原意。本例之中不能變動的是指針本身,不是指針所指的內容。
第二個原因和語法替換原則(syntactical substitution principle)有關,那是處理 template 程序代碼時常會遭遇的問題。考慮下面兩個類型定義:
typedef char* CHARS; typedef CHARS const CPTR; // 一個用以「指向 chars」的 const 指針,如果我們做文字上的替換,把 CHARS 替換為其代表物,上述第二個聲明的原意就得以保留: typedef char* const CPTR; // 一個用以「指向 chars」的 const 指針。然而如果我們把 const 寫在被修飾物之前,上述規則便不適用。考慮上述聲明的另一種變化: typedef char* CHARS; typedef const CHARS CPTR; // 一個用以「指向 chars」的 const 指針,現在,對 CHARS 進行文字替換,會導出不同的含義: typedef const char* CPTR; // 一個用以「指向 const chars」的指針面對volatile飾詞,也有同樣考慮。關于空白符號,我們決定把他放在"&"符號和參數名稱中間:
void foo (int const& x);
這樣可以更加突出參數的類型和名稱。無可否認,以下聲明方式可能較易引起疑惑:
char *a, b;
根據從 C 語言繼承下來的規則,a 是個指針而b 是個一般的 char。為了避免這種混淆,我們可以一次聲明一個變量,不要集中于同一行聲明語句。
本書并不是一本討論C++標準庫的書,但我們確實在一些例子中用到了標準庫。一般 來說,我們使用C++特有的 頭文件(例如<iostream> 而非<stdio.h>) 。惟一的例外是<stddef.h>,我們使用它而不使用<cstddef>,以避免類型 size_t 和 ptrdiff_t 被冠以 std::前綴詞。這樣做更具可移植性,而且 std::size_t 并不比 size_t 多出什么好處。
#include<cstdio> #include<iostream> using namespace std; int main() {const int N=100;int const N=100; //二者等價int mark=0;//1int* ref_mark=&mark;int* const book1=ref_mark;//指針book1是個常量,并沒有說明這個指針指向的int值是個常量const int* book2=ref_mark;//指針book2是個指針類型的常量cout<<"N1:"<<N1<<endl;cout<<"N2:"<<N2<<endl;*book1=10;cout<<*book1<<endl;*book2=20;/*|error: assignment of read-only location ‘* book2’|const int *book2=ref_mark*/cout<<*book1<<endl;cout<<*book2<<endl;//2typedef char* CHARS;typedef CHARS const CPTR; //替換后typedef char * const CPTR;//仍然是指向char類型的常量指針 typedef const CHARS CPTR; //替換后typedef const char * CPTR;//是指向char類型的指針 }?
轉載于:https://www.cnblogs.com/jianfengyun/p/3714569.html
總結
以上是生活随笔為你收集整理的templates(0.1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 点击渲染ajax,vue中在页面
- 下一篇: 用C语言实现俄罗斯方块游戏