2012-05-20
Chapter09
1、復制構造函數淺復制時的隱患
???????? 若對象中有指針成員,則當對象作為形參傳入時
???????? 例如void myFun(Spreadsheet s)……
?????????????????? Spreadsheet s1(5,3);
?????????????????? myFun(s1);//??? s1與s中的指針成員指向同一塊內存(s是由s1通過復制構造函數生成的),當myFun()結束時,會釋放s,則s指針成員所指向空間釋放,導致s1的指針成員指向的空間釋放,即s1的指針成員指向一塊已經釋放的內存。
2、賦值運算符淺復制時的隱患
???????? Spreadsheet s1(2,2),s2(4,3);
???????? s1=s2;
???????? 則s1,s2中的指針成員指向了同一塊內存(s1的),導致s2的指針成員原來所指向的內存成了孤兒內存
???????? ∴重寫賦值運算符注意的三點
???????? 1,檢查自賦值情況。2,刪除原來所指向的內存,并用rhs的值重新分配內存。3,返回(*this),即對象的引用
3、也可將復制構造函數與賦值運算符設為私有(不必實現),禁止用戶這么做(比如數組類)
???????? private:
?????????????????? Spreadsheet (const Spreadsheet &src);
?????????????????? Spreadsheet &operator=(const Spreadsheet &src);
4、靜態數據成員:一個與類關聯而不是與對象關聯的數據成員
???????? 會默認初始化為0,在函數與方法體之外進行初始化
???????? int Spreadsheet::sCounter=0;?????????????????? //初始化
5、const數據成員:通常是靜態的
???????? 盡可能用static const 取代全局變量
???????? ∵是static ∴必須在源文件中為其聲明空間(方法體外)
?????????????????? 如?const int Spreadsheet::MaxValue=100;
???????? 另外,C++允許在類文件中聲明這些變量的同時為其賦值
???????? class Spreadsheet
???????? {
?????????????????? public : static const int MaxValue=100;
???????? }
6、靜態方法:方法應用于整個類,而不是單個對象
???????? ∴并不是在一個特定的對象上調用,即沒有this指針
???????? 不能在靜態方法中訪問非靜態成員
???????? 在類中像調用常規函數一樣調用靜態方法。
???????? 若聲明為public,則在類外可這樣調用
???????? string str=Spreadsheet::doubleToString(5);
7、const方法
???????? 如果有一個const對象或者對const對象的引用,編譯器不允許該對象調用任何方法(防止修改數據成員),除非是const方法
???????? 例如:double getValue() const;?????????????? //類定義中,即頭文件中
?????????????????? double SpreadsheetCell::getValue()??????? const
???????? {??????? return mValue;???????????????????????????????????? //方法定義中,即源文件中
???????? }//const不能修改數據成員,否則編譯器報錯
????????
???????? 非const對象可調用非const、const方法
???????? const對象只能調用const方法
8、關鍵詞mutable
???????? 在const方法中,編譯器不允許修改普通數據成員,但可在const方法中修改mutable數據成員
???????? 如在類定義中:mutable int NumberAccess;
???????? 則可在const方法中修改NumberAccess的值
9、函數重載:補遺
???????? 可以編寫兩個同名且參數相同的方法,一個聲明const,一個不聲明
???????? 若提供const對象,調用const方法,反之亦然
10、內聯
???????? 法一:在類定義中inline聲明,方法定義中實現
???????? 法二:類定義中直接寫出其方法定義,即在類定義中展開代碼,無需關鍵詞inline
11、友元
???????? 類可以將其他非成員函數聲明為友元,可以訪問protected、private成員和方法
???????? 類的內部會暴露給其他類或函數,破壞抽象原則
???????? 所以,在有限的情況下(如運算符重載)使用友元