1. Header(頭文件)中的防衛式聲明
complex.h
#ifndef __COMPLEX__
#define __COMPLEX__
...
#endif
2. constructor(ctor,構造函數)
complex (double r = 0, double i = 0): re (r), im (i) { }
盡量使用initialization list(初值列,初始列),而不是assignment(賦值)
3. const member functions(常量成員函數)
double real () const { return re; }
常量對象,以及常量對象的引用或指針都智能調用常量成員函數
4. 參數傳遞:pass by value vs. pass by reference(to const)
建議使用引用類型的形參替代指針
使用引用避免拷貝
拷貝大的類類型對象或者容器對象比較低效,甚至有的類類型(包括IO類型在內)根本就不支持拷貝操作,當某種類型不支持拷貝操作時,函數就只能通過引用形參訪問該類型的對象當用實參初始化形參時會忽略掉頂層const。當形參有頂層const時,傳給他常量對象或者非常量對象都是可以的
盡量使用常量引用
把函數不會改變的形參定義成(普通的)引用是一種比較常見的錯誤,這么做帶給函數的調用者一種誤導,即函數可以修改它的實參的值。此外,使用引用而非常量引用也會極大地限制函數所能接受的實參類型。比如我們不能把const對象、字面值或者需要類型轉換的對象傳遞給普通的引用形參。
5. 返回值傳遞:return by vlaue vs. return by referencr(to const)
返回值不是local object,就可以return by reference
6. friend(友元)
類向外部提供其非共有成員訪問權限的一種機制。友元的訪問權限與成員函數一樣。友元可以是類,也可以是函數
相同class的各個objects互為friends(友元)
7. operator overloading(操作符重載-1,成員函數) this
成員函數通過一個名為this的額外的隱式參數來訪問調用它的那個對象。當我們調用一個成員函數時,用請求該函數的對象地址初始化this
當操作符重載函數作為類的成員函數時,操作符重載函數的參數會比作為友元或者獨立于類的操作符重載函數少一個參數,因為操作符重載類成員函數把調用該函數的對象作為函數的第一個參數,也就是隱含的this指針指向調用該函數的第一個對象,所以會少一個參數。
必須作為類成員函數的運算符有:(),[],->和任何賦值運算符,重載這些運算符時必須把操作符函數聲明為類的成員函數
8. operator overloading(操作符重載-2,非成員函數) (無this)
為了應對某一操作符的多種用法,需要分別進行重載
重載限制
- 并不是所有的操作符都能被重載。除了. ,.* ,:: ,? : ,sizeof,typeid這幾個運算符不能被重載,其他運算符都能被重載
- 重載不能改變該運算符用于內置類型時的函義,程序員不能改變運算符+用于兩個int型時的含義
- 運算符函數的參數至少有一個必須是類的對象或者類的對象的引用。這種規定可以防止程序員運用運算符改變內置類型的函義。
- 重載不能改變運算符的優先級
- 重載不能改變運算符的結合律
- 重載不能改變運算符操作數的個數。比如+需要兩個操作數,則重載的+也必須要有兩個操作數。