1. 特殊的成員函數
C++11在原有的4個特殊成員函數(默認構造函數、復制構造函數、復制賦值運算符和析構函數)的基礎上新增了移動構造函數和移動賦值運算符。這些特殊成員函數在各種情況下是會通過編譯器自動提供的。
- 默認構造函數 :如果未定義任何構造函數,編譯器將提供一個默認構造函數,對于類成員則調用其默認構造函數(對于內置的成員,默認構造函數不對其進行初始化。如果使用者提供了移動構造函數,編譯器將不會自動提供默認構造函數)。
- 復制構造函數 :如果未定義復制構造函數,而代碼有需要使用它,編譯器將提供一個默認的復制構造函數。(如果使用者提供了類的移動構造函數的情況下,編譯器將不會自動提供復制構造函數)
- 移動構造函數 :如果未定義移動構造函數,而代碼有需要使用它,編譯器將提供一個默認的移動構造函數。(如果使用者提供了類的析構函數、復制構造函數、復制賦值運算符或移動賦值運算符的情況下,編譯器將不會自動提供移動構造函數)
- 復制賦值運算符 :如果未定義復制賦值運算符,而代碼有需要使用它,編譯器將提供一個默認的復制賦值運算符。(如果使用者提供了移動賦值運算符,編譯器不會自動提供復制賦值運算符)
- 移動賦值運算符 :如果未定義移動賦值運算符,而代碼有需要使用它,編譯器將提供一個默認的移動賦值運算符。(如果使用者提供了復制構造函數、移動構造函數、復制賦值運算符或析構函數,編譯器不會自動提供移動賦值運算符)
當用戶在定義某些特殊函數后,導致另外某個特殊函數不會自動創建,這時候用戶仍可以使用關鍵詞 default
強制編譯器生成隱式聲明的目標特殊成員函數函數。例如用戶定義了移動構造函數,編譯器不會自動構建默認構造函數、復制構造函數和復制賦值運算符,這種情況下我們可以通過default
強制編譯器創建這些方法的默認版本:
class A{
public:
A(A &&);
A() = default;
A(const A&) = default;
A & operator = (const A&) = default;
};
同時,有些時候,我們不希望編譯器為我們提供某個特殊的成員函數默認版本,我們可以使用關鍵字delete
來禁止編譯器使用特定方法。 關鍵字default
只能用于這個6個特殊的成員數(默認構造函數、復制構造函數、復制賦值運算符、移動構造函數、移動賦值運算符和析構函數),但delete
可以用于任何成員函數 。例如:
class A{
public:
A() = delete;//禁止編譯器生成默認構造函數
void readDoubleNum(double);
}
class B{
public:
B() = delete;//禁止編譯器生成默認構造函數
void readDoubleNum(double);
void readDoubleNum(int) = delete;//禁用readDoubleNum函數的特定轉換
};
A a;
a.readDoubleNum(5.0);//正確
a.readDoubleNum(5);//正確,int值5將被轉換為5.0,進而執行readDoubleNum(double)方法
B b;
b.readDoubleNum(5.0);
b.readDoubleNum(5);//錯誤,其與readDoubleNum(int)原型匹配,編譯器檢測到該方法被禁用后,在編譯階段就會報錯,防止int到double的特定轉換
2. override和final
override標識符
override
說明符的作用是用來指定一個虛函數覆蓋另外一個虛函數。其用法如下:class A{ virtual void fun(); ... }; class B : A{ void fun() override;//B::fun將覆蓋A::fun ... };
C++11引入
override
標識符的目的就是為了在重寫基類的方法時候,防止重寫方法的類型、名稱和參數列表因為人為因素造成其與基類的不一致,無法使用多態。使用override
標識符將重寫的檢查工作(重寫方法的類型、名稱和參數列表要與基類的保持一致)交給編譯器處理,減少人為出錯的可能。final標識符
final
標識符的作用是指定某個虛函數不能在派生類中被覆蓋,或者某個類不能被派生。其使用方法如下:
calss A{
virtual void fun();
};
class B : A{
void fun() final;//A::fun被覆蓋,而且B::fun是最終被覆蓋函數
void ba() final;//錯誤,ba非虛函數,因此它不能是final
};
class C final: B{//C為final
void fun() override;//錯誤,fun不能被覆蓋,因為其在B中為final
};
class D : C{};//錯誤,因為類C位final,其不可以被派生
-
編譯器
+關注
關注
1文章
1642瀏覽量
49224 -
C++語言
+關注
關注
0文章
147瀏覽量
7017 -
運算符
+關注
關注
0文章
172瀏覽量
11095
發布評論請先 登錄
相關推薦
評論