C++88個注意點子之11~20

11. string 中又c_str()函數轉換爲char str[]; 但返回爲const char *,要持續訪問,則需複製c_str函數返回的數組。

注意:在C++中,string類型與char型數組的區別,在string類的具體實現中也是用char型數組實現的。python和java中string類型是不可變類型,與基本類型一樣。但是在C++中string類型是可改變類型。


12. typedef 的用法

在某個聲明前加一個typedef關鍵字即將變量名變爲類型名。

例如:typedef int word[80];

word a;

這樣是將a聲明爲一個int類型的數組,數組長度爲80。

看到typedef的時候,可以將變量名如a,替換typedef式中的word,去掉typedef,變成了int a[80]。是不是很一目瞭然。


13. 在函數形參設置方面,可以選用引用&來傳遞各種類。

例如:void print(const vector<int> &b);

這樣比值傳遞效率要高很多,如void print(const vector<int> b);

vector類型值傳遞時會調用複製構造函數,然後每個值依次複製,當實參很大的時候,光復制就要消耗很長的時間。所以推薦大家經常注意使用引用,在C++中確實很方便。也正是由於這種高效性,在很多高級語言中都使用了引用機制。(如java, python等)


14. 對於用new來定義const變量:

const int *pci  = new const int(1024);


19. switch語句中, switch(表達式)中的表達式必須是整數型或可轉換成整數型(如char型)。

case關鍵字後面必須接一個常量表達式--->整數型或可轉換成整數型

若未明確在case後面加break,則程序在進入這次case後會一直執行,越過後面的case判斷,直接執行後面case體中的代碼。值得注意的是switch作用域,比如switch(int a = (b+3)),a變量作用域存在用整個switch塊中,a與case中的值比較。在case中定義變量一般是不被允許的,除非出現在switch中的最後一個case標號或default標號後面定義變量。這個規則是爲了避免出現代碼跳過變量定義和初始化的情況。

例如:

case true:

         string file_name = get_file_name();

         break;

case false:

        ...........

file_name變量從它定義開始到所在塊結束都是有效的,比如在false情況中所以file_name變量就有危險情況,萬一程序跳過true,直接進入false就很危險了。

如果一定要在case後處理過程加入臨時變量,一定要引入塊作用域。實際上一般在case後面加塊域是個很好的習慣。


20. 關於cin輸入流中的一些方法,如cin.get(), cin.getline(),我們來注意一下幾點。

cin >> a;中 >>操作符會過濾掉不可見字符,遇到空格,回車都會結束。像tab, space, enter等都會跳過丟棄。和scanf一樣。

cin.get()函數有兩點情況,1.在無參和有一個參數的情況下,不丟棄enter和space

2.在兩個字符時,如cin.get(array_name, asize),有效字符長度爲asize-1。會丟棄enter,並遇到enter結束。

cin.getline()與cin.getline(str, size)時 會丟棄enter,與get(array_name, asize)很相似。但是唯一不同的是cin.getline(),若長度超過了會報錯,不會繼續讀下去。

關於輸入輸出流我們在後面會繼續談到。







發佈了65 篇原創文章 · 獲贊 75 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章