C++編譯器隱含規則

構造函數的調用:
1. 在初始化時調用(構造函數)
String str("some text.");
2. 在類型轉換時調用(轉換構造函數)
String str = String("some text.");
3. 在隱式類型轉換作傳值函數實參時調用(隱式構造函數)
<pre name="code" class="plain">void Print(String str)
{
	printf("%s\n", str.m_str);
}
Print("auto print.");


拷貝構造函數的調用:

1. 拷貝構造函數缺省時,在拷貝初始化時調用(合成拷貝構造函數)
String stra("string");
String strb = stra;// 等同於對所有成員變量進行一次賦值操作。
2. 拷貝構造函數已定義時,在拷貝初始化時調用(拷貝構造函數)
String stra("string");
String strb = stra;// 調用定義的拷貝構造函數。
3. 函數的形參是一個類的實例時,在函數入口時調用(拷貝構造函數)
void Print(String str)// 調用定義的拷貝構造函數。
{
	printf("%s\n", str.m_str);
}
String stra("auto print.");
Print(stra);<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">	</span>


重載賦值運算符的調用:

1. 在重載賦值運算符已定義時,拷貝構造函數缺省時,在拷貝初始化時調用
(合成拷貝構造函數+重載賦值運算符)
String stra("string");
String strb = stra;// 等同於對所有成員變量進行一次重載賦值運算符操作。
2. 在重載賦值運算符已定義時,在賦值時調用
String stra("string");
String strb("some text.");
stra = strb;// 調用重載賦值運算符
strb = "string";// 調用重載賦值運算符
注意:如果拷貝構造函數和重載賦值運算符都缺省,那麼拷貝初始化時將調用
“合成拷貝構造函數”,同時對所有成員進行一次“普通賦值”操作,此時只相當於
進行內存複製。若需要複製指針指向的內容(如成員是一個鏈表),那麼必須
選擇定義
i. (類的)拷貝構造函數 或
ii.(類成員的)重載複製運算符
通常情況下,我們選擇ii.,定義(類成員的)重載賦值運算符,同時缺省地選用
(類的)合成拷貝構造函數。因爲類成員是更底層的類,因此複用率將更高。
更一般地,對最底層的類定義完整的“構造函數”,“拷貝構造函數”,“重載賦值運算符”
和“析構函數”,那麼更高層的類即可應用缺省的合成拷貝構造函數和缺省的賦值運算符
對其成員進行直接調用了。


析構函數的調用:
1. 可行域結束時調用
{
	String stra("string");
}// 調用析構函數
2. 函數的形參是一個類的實例時,在函數返回時調用
void Print(String str)
{
	printf("%s\n", str.m_str);
}// 調用析構函數
String stra("auto print.");
Print(stra);
注意:此時如果沒有定義拷貝構造函數而定義了析構函數,那麼將不會調用拷貝構造
函數(而是調用合成拷貝構造函數),但是仍會調用析構函數,造成不對稱調用。
因此函數的形參是一個類的實例時,一定要記得定義拷貝構造函數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章