1. 特殊的成員函數(shù)
C++11在原有的4個(gè)特殊成員函數(shù)(默認(rèn)構(gòu)造函數(shù)、復(fù)制構(gòu)造函數(shù)、復(fù)制賦值運(yùn)算符和析構(gòu)函數(shù))的基礎(chǔ)上新增了移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符。這些特殊成員函數(shù)在各種情況下是會(huì)通過(guò)編譯器自動(dòng)提供的。
- 默認(rèn)構(gòu)造函數(shù) :如果未定義任何構(gòu)造函數(shù),編譯器將提供一個(gè)默認(rèn)構(gòu)造函數(shù),對(duì)于類(lèi)成員則調(diào)用其默認(rèn)構(gòu)造函數(shù)(對(duì)于內(nèi)置的成員,默認(rèn)構(gòu)造函數(shù)不對(duì)其進(jìn)行初始化。如果使用者提供了移動(dòng)構(gòu)造函數(shù),編譯器將不會(huì)自動(dòng)提供默認(rèn)構(gòu)造函數(shù))。
- 復(fù)制構(gòu)造函數(shù) :如果未定義復(fù)制構(gòu)造函數(shù),而代碼有需要使用它,編譯器將提供一個(gè)默認(rèn)的復(fù)制構(gòu)造函數(shù)。(如果使用者提供了類(lèi)的移動(dòng)構(gòu)造函數(shù)的情況下,編譯器將不會(huì)自動(dòng)提供復(fù)制構(gòu)造函數(shù))
- 移動(dòng)構(gòu)造函數(shù) :如果未定義移動(dòng)構(gòu)造函數(shù),而代碼有需要使用它,編譯器將提供一個(gè)默認(rèn)的移動(dòng)構(gòu)造函數(shù)。(如果使用者提供了類(lèi)的析構(gòu)函數(shù)、復(fù)制構(gòu)造函數(shù)、復(fù)制賦值運(yùn)算符或移動(dòng)賦值運(yùn)算符的情況下,編譯器將不會(huì)自動(dòng)提供移動(dòng)構(gòu)造函數(shù))
- 復(fù)制賦值運(yùn)算符 :如果未定義復(fù)制賦值運(yùn)算符,而代碼有需要使用它,編譯器將提供一個(gè)默認(rèn)的復(fù)制賦值運(yùn)算符。(如果使用者提供了移動(dòng)賦值運(yùn)算符,編譯器不會(huì)自動(dòng)提供復(fù)制賦值運(yùn)算符)
- 移動(dòng)賦值運(yùn)算符 :如果未定義移動(dòng)賦值運(yùn)算符,而代碼有需要使用它,編譯器將提供一個(gè)默認(rèn)的移動(dòng)賦值運(yùn)算符。(如果使用者提供了復(fù)制構(gòu)造函數(shù)、移動(dòng)構(gòu)造函數(shù)、復(fù)制賦值運(yùn)算符或析構(gòu)函數(shù),編譯器不會(huì)自動(dòng)提供移動(dòng)賦值運(yùn)算符)
當(dāng)用戶(hù)在定義某些特殊函數(shù)后,導(dǎo)致另外某個(gè)特殊函數(shù)不會(huì)自動(dòng)創(chuàng)建,這時(shí)候用戶(hù)仍可以使用關(guān)鍵詞 default
強(qiáng)制編譯器生成隱式聲明的目標(biāo)特殊成員函數(shù)函數(shù)。例如用戶(hù)定義了移動(dòng)構(gòu)造函數(shù),編譯器不會(huì)自動(dòng)構(gòu)建默認(rèn)構(gòu)造函數(shù)、復(fù)制構(gòu)造函數(shù)和復(fù)制賦值運(yùn)算符,這種情況下我們可以通過(guò)default
強(qiáng)制編譯器創(chuàng)建這些方法的默認(rèn)版本:
class A{
public:
A(A &&);
A() = default;
A(const A&) = default;
A & operator = (const A&) = default;
};
同時(shí),有些時(shí)候,我們不希望編譯器為我們提供某個(gè)特殊的成員函數(shù)默認(rèn)版本,我們可以使用關(guān)鍵字delete
來(lái)禁止編譯器使用特定方法。 關(guān)鍵字default
只能用于這個(gè)6個(gè)特殊的成員數(shù)(默認(rèn)構(gòu)造函數(shù)、復(fù)制構(gòu)造函數(shù)、復(fù)制賦值運(yùn)算符、移動(dòng)構(gòu)造函數(shù)、移動(dòng)賦值運(yùn)算符和析構(gòu)函數(shù)),但delete
可以用于任何成員函數(shù) 。例如:
class A{
public:
A() = delete;//禁止編譯器生成默認(rèn)構(gòu)造函數(shù)
void readDoubleNum(double);
}
class B{
public:
B() = delete;//禁止編譯器生成默認(rèn)構(gòu)造函數(shù)
void readDoubleNum(double);
void readDoubleNum(int) = delete;//禁用readDoubleNum函數(shù)的特定轉(zhuǎn)換
};
A a;
a.readDoubleNum(5.0);//正確
a.readDoubleNum(5);//正確,int值5將被轉(zhuǎn)換為5.0,進(jìn)而執(zhí)行readDoubleNum(double)方法
B b;
b.readDoubleNum(5.0);
b.readDoubleNum(5);//錯(cuò)誤,其與readDoubleNum(int)原型匹配,編譯器檢測(cè)到該方法被禁用后,在編譯階段就會(huì)報(bào)錯(cuò),防止int到double的特定轉(zhuǎn)換
2. override和final
override標(biāo)識(shí)符
override
說(shuō)明符的作用是用來(lái)指定一個(gè)虛函數(shù)覆蓋另外一個(gè)虛函數(shù)。其用法如下:class A{ virtual void fun(); ... }; class B : A{ void fun() override;//B::fun將覆蓋A::fun ... };
C++11引入
override
標(biāo)識(shí)符的目的就是為了在重寫(xiě)基類(lèi)的方法時(shí)候,防止重寫(xiě)方法的類(lèi)型、名稱(chēng)和參數(shù)列表因?yàn)槿藶橐蛩卦斐善渑c基類(lèi)的不一致,無(wú)法使用多態(tài)。使用override
標(biāo)識(shí)符將重寫(xiě)的檢查工作(重寫(xiě)方法的類(lèi)型、名稱(chēng)和參數(shù)列表要與基類(lèi)的保持一致)交給編譯器處理,減少人為出錯(cuò)的可能。final標(biāo)識(shí)符
final
標(biāo)識(shí)符的作用是指定某個(gè)虛函數(shù)不能在派生類(lèi)中被覆蓋,或者某個(gè)類(lèi)不能被派生。其使用方法如下:
calss A{
virtual void fun();
};
class B : A{
void fun() final;//A::fun被覆蓋,而且B::fun是最終被覆蓋函數(shù)
void ba() final;//錯(cuò)誤,ba非虛函數(shù),因此它不能是final
};
class C final: B{//C為final
void fun() override;//錯(cuò)誤,fun不能被覆蓋,因?yàn)槠湓贐中為final
};
class D : C{};//錯(cuò)誤,因?yàn)轭?lèi)C位final,其不可以被派生
-
編譯器
+關(guān)注
關(guān)注
1文章
1662瀏覽量
50228 -
C++語(yǔ)言
+關(guān)注
關(guān)注
0文章
147瀏覽量
7303 -
運(yùn)算符
+關(guān)注
關(guān)注
0文章
173瀏覽量
11485
發(fā)布評(píng)論請(qǐng)先 登錄
使用C++11新特性實(shí)現(xiàn)一個(gè)通用的線(xiàn)程池設(shè)計(jì)

vc的常用類(lèi)和成員函數(shù)
類(lèi)成員函數(shù)中const的使用,有什么注意事項(xiàng)?
如何在rt-thread的env環(huán)境中配置C++11?
類(lèi)成員函數(shù)與普通函數(shù)的區(qū)別研究
final關(guān)鍵字的用法

《深入理解C++11》C++11新特性解析與應(yīng)用的詳細(xì)電子教材免費(fèi)下載
C++:詳談構(gòu)造函數(shù)

EE-128:C++中的DSP:從C++調(diào)用匯編類(lèi)成員函數(shù)

類(lèi)的申明和成員函數(shù)定義分離是什么
淺談C++的mutable關(guān)鍵字
函數(shù)結(jié)構(gòu)的定義和例程說(shuō)明
重點(diǎn)了解一下C++11 包裝器function
EE-128:C語(yǔ)言中的DSP:從C調(diào)用匯編類(lèi)成員函數(shù)

評(píng)論