1.缺省情況下, 用一個類的對象初始化另一個對象, 或者向該類另一個對象賦值, 都由缺省的按成員語義(default memberwise semantics)支持
在某些情況下, 對類的安全性和處理正確性是不夠的, 需要類設計者提供特殊的拷貝構造函數(copy constructor)和拷貝賦值操作符(copy assignment
operator)的定義
2.new類對象 --只有new表達式成功的申請到空間內存, 構造函數才會被調用
3.構造函數定義為inline時, 創建對象是會在調用點展開構造函數
4.成員初始化列表(member initialization list)
5.構造函數不能用const或volatile關鍵字來聲明
一個const類對象在"從其構造函數完成到析構函數開始"這段時間內才被認為是const, volatile類對象也一樣
6.explicit修飾符通知編譯器不要提供隱式轉換
void print(const CTest &test);
//...
print("oops"); //這種調用會把"oops"轉換成一個CTest對象
缺省情況下, 單參數構造函數(或者有多個參數, 除了第一個參數外, 其他都有缺省實參)被用作轉換符
無意的隱式類轉換, 是很難跟蹤的錯誤!, 關鍵字explicit被引入到標準c++中, 以幫助我們抑制這種不受歡迎的編譯輔助行為
explicit只能被應用在構造函數上
7.缺省構造函數是不需要用戶指定實參就能夠被調用的構造函數, --并不意味著它不能接受實參, 只意味著構造函數的每個參數都有一個缺省值與之關聯
8.限制對象創建 --把相關構造函數放到非公有訪問區內, 從而限制或顯示禁止某些形式的對創建動作
在實際的c++程序中, 非公有的構造函數主要用處是:
防止用一個類對象想該類另一個對象做拷貝
指出只有當一個類在繼承層次中被用作基類, 而不能直接被應用程序操縱時, 構造函數才能被調用
9.拷貝構造函數 --用一個類對象初始化該類的另一個對象被稱為缺省按成員初始化(default memberwise initialization)
一個類對象想該類的另一個對象作拷貝是通過依次拷貝每個非靜態數據成員來實現
類設計者可以通過提供特殊的拷貝構造函數(copy constructor)來改變缺省的行為
拷貝構造函數不一定是const, 但它卻必須是引用
10.無論何時, 當在一個函數內刪除一個獨立的堆對象時, 最好使用auto_ptr類對象而不是一個實際的指針
如果delete表達式失敗, 如一個異常被拋出, 會到時內存泄露(異常拋出, 跳過了delete操作?), 不會調用析構函數
所以建議用auto_ptr智能指針
11.對于在堆中分配的類對象數組的元素, 我們沒有辦法提供一組顯示的值來做初始化, 如果細化支持通過new表達式分配數組, 則類必須提供一個缺省的構
造函數, 或不提供構造函數
12.用一個類對象初始化另一個類對象, 稱為按成員初始化(default memberwise initialization)
發生在 用一個類對象顯示的初始化另一個對象
把一個類對象作為實參傳遞給一個函數
把一個類對象作為一個函數的返回值傳遞回來
非空順序容器類型的定義
把一個類對象插入到一個容器類型中
13.成員類對象初始化
14.缺省按成員賦值(default memberwise assignment) --用一個類對象向該類的另一個對象的賦值操作
用隱式的拷貝賦值操作符
一般來所, 如果缺省的按成員初始化對于一個類不合適, 則缺省的按成員賦值也不合適
通過提供一個現實的拷貝賦值操作符的實例, 可以改變缺省的按成員賦值
注意要防止一個類對象向自己賦值 --對于"先釋放與該對象當前相關的資源, 以便分配與被拷貝對象相關資源"這樣的拷貝賦值操作符, 拷貝自身尤其不
合適
當一個類對象被賦值給該類的另一個對象是:
a檢查該類, 判斷是否提供了一個現實的拷貝賦值操作符
b如果是, 檢查訪問權限, 判斷是否可以被調用
c如果不能被調用, 編譯錯誤, 否則執行這個調用
d如果該類沒有提供顯示的拷貝賦值操作符, 則執行按缺省成員賦值
e在缺省按成員賦值下, 每個內置類型或復合類型的數據成員被賦值給相應的成員
f對于每個類成員對象, 遞歸執行a到f步, 知道所有內置或復合類型的數據成員都被賦值
如果希望完全禁止按成員拷貝的行文, 將操作符聲明為private并且不提供實際定義即可
一般來說, 應該將拷貝構造函數和拷貝賦值操作視為一個個體單元
15.C++語言不能有效地返回一個類對象, 這被視為c++語言的一個重大缺陷
16.c++類對象的初始化總是比賦值更有效