一、const引用形參
應該將不需要修改的實參的形參設置爲const引用類型,這樣的話,比較靈活,可以傳遞const和非const類型,且避免含有普通的非引用形參的函數複製元素。
二、指向指針的引用形參
(int* &a)可以改變指針的值。
三、容器作參數
C++ 程序員傾向於通過傳遞指向容器中需要處理的元素的迭代器來傳遞容器:
void print(vector<int>::const_iterator beg,
vector<int>::const_iterator end)
{
while (beg != end) {
cout << *beg++;
if (beg != end) cout << " "; // no space after last element
}
cout << endl;
}
四、傳遞給函數的數組的處理
- 第一種方法是在數組本身放置一個標記來檢測數組的結束。C 風格字符串就是採用這種方法的一個例子,它是一種字符數組,並且以空字符 null 作爲結束的標記。
- 使用標準庫規範,第二種方法是傳遞指向數組第一個和最後一個元素的下一個位置的指針。調用這個版本的函數需要傳遞兩個指針:一個指向要輸出的第一個元素,另一個則指向最後一個元素的下一個位置。只要正確計算指針,使它們標記一段有
效的元素範圍,程序就會安全。
- 第三種方法是將第二個形參定義爲表示數組的大小,這種用法在 C 程序和標準化之前的 C++ 程序中十分普遍。
五、返回引用
當函數返回引用類型時,沒有複製返回值。相反,返回的是對象本身。
理解返回引用至關重要的是:千萬不能返回局部變量的引用。當函數執行完畢時,將釋放分配給局部對象的存儲空間。此時,對局部對象的引用就會指向不確定的內存。優點是:不需要開闢新空間保存變量,針對非局部變量。
千萬不要返回指向局部對象的指針。
六、常成員函數
const 對象、指向 const 對象的指針或引用只能用於調用其const 成員函數,如果嘗試用它們來調用非 const 成員函數,則是錯誤的。常成員函數只能讀取對象的數據,不能修改。
普通對象可以調用常成員函數和非常成員函數。
常對象只能調用const成員函數。
七、用 typedef 簡化函數指針的定義
函數指針類型相當地冗長。使用 typedef 爲指針類型定義同義詞,可將函數指針的使用大大簡化::
typedef bool (*cmpFcn)(const string &, const string &);
在要使
用這種函數指針類型時,只需直接使用 cmpFcn 即可,不必每次都把整個類型聲明全部寫出來。
八、stringstream 對象的和使用
有些程序需要同時使用這兩種方式:有些處理基於每行實現,而其他處理則要操縱每行中每
個單詞。可用 stringstreams 對象實現。用getline()和istringstream實現。
stringstream 提供的轉換和/或格式化。stringstream 對象的一個常見用法是,需要在多種數據類型之間實現自動格式化時使用該類類型。
C++ 使用標準庫類處理輸入和輸出:
• iostream 類處理面向流的輸入和輸出。
• fstream 類處理已命名文件的 IO。
• stringstream 類處理內存中字符串的 IO。
九、構造函數
可以初始化 const 對象或引用類型的對象,但不能對它們賦值。在開始執行構造函數的函數體之前,要完成初始化。初始化 const 或引用類型數據成員的唯一機會是構造函數初始化列表中。
當類成員需要使用初始化列表時,通過常規地使用構造函數初始化列表,就可以避免發生編譯時錯誤。
除非有明顯的理由想要定義隱式轉換,否則,單形參構造函數應該爲 explicit。將構造函數設置爲explicit 可以避免錯誤,並且當轉換有用時,用戶可以顯式地構造對象。
複製構造函數的定義與其他構造函數一樣:它與類同名,沒有返回值,可以(而且應該)使用構造函數初
始化列表初始化新創建對象的成員,可以在函數體中做任何其他必要工作。有指針或分配其他資源時需要顯式定義複製構造函數。
十、靜態對象
類可以定義 類 靜態成員,而不是定義一個可普遍訪問的全局對象。
static 成員函數沒有 this 指針。
十一、析構函數
如果類需要析構函數,則它也需要賦值操作符和複製構造函數,這是一個有用的經驗法則。這個規則常稱爲 三法則,指的是如果需要析構函數,則需要所有這三個複製控制成員。
十二、賦值操作符
賦值操作符首先要檢查對象是否不同。賦值時需刪除左操作數,並在撤銷左操作數的成員之後,將右操作數的成員賦值給左操作數的相應成員。如果對象是相同的,則撤銷左操作數的成員也將撤銷右操作數的成員!
十三、虛函數
派生類一般會重定義所繼承的虛函數。
派生類中虛函數的聲明(第 7.4 節)必須與基類中的定義方式完全匹配,但有一個例外:返回對基類型的引用(或指針)的虛函數。派生類中的虛函數可以返回基類函數所返回類型的派生類的引用(或指針)。