??樊梓慕:個(gè)人主頁(yè)
???個(gè)人專欄:《C語(yǔ)言》《數(shù)據(jù)結(jié)構(gòu)》《藍(lán)橋杯試題》《LeetCode刷題筆記》《實(shí)訓(xùn)項(xiàng)目》《C++》《Linux》《算法》
??每一個(gè)不曾起舞的日子,都是對(duì)生命的辜負(fù)
目錄
前言
默認(rèn)成員函數(shù)
類成員變量初始化
強(qiáng)制生成默認(rèn)函數(shù)的關(guān)鍵字default
禁止生成默認(rèn)函數(shù)的關(guān)鍵字delete
final 和 override 關(guān)鍵字
final
override
前言
在C++11中,類增加了2個(gè)新的默認(rèn)成員函數(shù),沒(méi)錯(cuò)就是我們上一篇?jiǎng)倓倢W(xué)習(xí)的移動(dòng)構(gòu)造與移動(dòng)賦值,并且新增了一些功能,比如default、delete、final和override等關(guān)鍵字,讓我們一起來(lái)探討一下吧!
歡迎大家??收藏??以便未來(lái)做題時(shí)可以快速找到思路,巧妙的方法可以事半功倍。?
=========================================================================文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-854746.html
GITEE相關(guān)代碼:??樊飛 (fanfei_c) - Gitee.com??
=========================================================================
默認(rèn)成員函數(shù)
原有的默認(rèn)成員函數(shù):
- 構(gòu)造函數(shù)
- 析構(gòu)函數(shù)
- 拷貝構(gòu)造函數(shù)
- 拷貝賦值重載
- 取地址重載
- const取地址重載
需要復(fù)習(xí)的小伙伴們自取
【C++】類和對(duì)象(中)之構(gòu)造函數(shù)與析構(gòu)函數(shù)http://t.csdnimg.cn/ds8up【C++】類和對(duì)象(中)之拷貝構(gòu)造與運(yùn)算符、操作符重載http://t.csdnimg.cn/XWAA5
C++11在原有6個(gè)默認(rèn)成員函數(shù)的基礎(chǔ)上,新增了2個(gè):『 移動(dòng)構(gòu)造函數(shù)』和『 移動(dòng)賦值重載』。
默認(rèn)移動(dòng)構(gòu)造和移動(dòng)賦值的生成條件
- 移動(dòng)構(gòu)造函數(shù)的生成條件:沒(méi)有自己實(shí)現(xiàn)移動(dòng)構(gòu)造函數(shù),并且沒(méi)有自己實(shí)現(xiàn)析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)和拷貝賦值函數(shù)。
- 移動(dòng)賦值重載函數(shù)的生成條件:沒(méi)有自己實(shí)現(xiàn)移動(dòng)賦值重載函數(shù),并且沒(méi)有自己實(shí)現(xiàn)析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)和拷貝賦值函數(shù)。
思考:為什么這里析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)和拷貝賦值函數(shù)在一起說(shuō)?
在實(shí)際的類中,這些要寫就都寫,?不會(huì)出現(xiàn)只實(shí)現(xiàn)其中一個(gè)的情況,因?yàn)橹挥猩婕暗缴羁截惖念惒判枰约簩?shí)現(xiàn)這三個(gè)默認(rèn)成員函數(shù),其他值拷貝的類用默認(rèn)生成的就行了。
也就是說(shuō),移動(dòng)構(gòu)造和移動(dòng)賦值的生成條件與之前六個(gè)默認(rèn)成員函數(shù)不同,并不是單純的沒(méi)有實(shí)現(xiàn)移動(dòng)構(gòu)造和移動(dòng)賦值編譯器就會(huì)默認(rèn)生成。
注意: 如果我們自己實(shí)現(xiàn)了移動(dòng)構(gòu)造或者移動(dòng)賦值,就算沒(méi)有實(shí)現(xiàn)拷貝構(gòu)造和拷貝賦值,編譯器也不會(huì)生成默認(rèn)的拷貝構(gòu)造和拷貝賦值。
思考:為什么我們實(shí)現(xiàn)了移動(dòng)語(yǔ)義,編譯器就不會(huì)默認(rèn)生成拷貝構(gòu)造和拷貝賦值了?
因?yàn)樾枰獙?shí)現(xiàn)移動(dòng)語(yǔ)義的類,往往需要我們自主實(shí)現(xiàn)拷貝構(gòu)造和拷貝賦值,還記得么:深拷貝的類才需要移動(dòng)構(gòu)造和移動(dòng)賦值,所以往往需要實(shí)現(xiàn)移動(dòng)語(yǔ)義的類,都會(huì)實(shí)現(xiàn)拷貝構(gòu)造和拷貝賦值的。
類成員變量初始化
默認(rèn)生成的構(gòu)造函數(shù),對(duì)于自定義類型的成員會(huì)調(diào)用其構(gòu)造函數(shù)進(jìn)行初始化,但并不會(huì)對(duì)內(nèi)置類型的成員進(jìn)行處理。于是C++11支持非靜態(tài)成員變量在聲明時(shí)進(jìn)行初始化賦值,默認(rèn)生成的構(gòu)造函數(shù)會(huì)使用這些缺省值對(duì)成員進(jìn)行初始化。比如:
class Person
{
public:
?? ?//...
private:
?? ?//非靜態(tài)成員變量,可以在成員聲明時(shí)給缺省值
?? ?F::string _name = "樊梓慕";
?? ?int _age = 20; ? ? ? ? ?
?? ?static int _n; //靜態(tài)成員變量不能給缺省值
};
強(qiáng)制生成默認(rèn)函數(shù)的關(guān)鍵字default
C++11可以讓我們更好的控制要使用的默認(rèn)成員函數(shù),假設(shè)在某些情況下我們需要使用某個(gè)默認(rèn)成員函數(shù),但是因?yàn)槟承┰驅(qū)е聼o(wú)法生成這個(gè)默認(rèn)成員函數(shù),這時(shí)可以使用default關(guān)鍵字強(qiáng)制生成某個(gè)默認(rèn)成員函數(shù)。
比如:我們提供了拷貝構(gòu)造函數(shù),就不會(huì)生成默認(rèn)移動(dòng)構(gòu)造了,那么我們可以使用default關(guān)鍵字強(qiáng)制生成移動(dòng)構(gòu)造。
class Person
{
public:
Person(const char* name = "", int age = 0)
:_name(name)
, _age(age)
{}
Person(const Person& p)
:_name(p._name)
, _age(p._age)
{}
Person(Person&& p) = default;
private:
F::string _name;
int _age;
};
int main()
{
Person s1;
Person s2 = s1;
Person s3 = std::move(s1);
return 0;
}
又比如,下面的Person類中實(shí)現(xiàn)了拷貝構(gòu)造函數(shù):
class Person
{
public:
?? ?//拷貝構(gòu)造函數(shù)
?? ?Person(const Person& p)
?? ??? ?:_name(p._name)
?? ??? ?, _age(p._age)
?? ?{}
private:
?? ?F::string _name;
?? ?int _age; ? ? ?
};
這時(shí)如下代碼就無(wú)法編譯成功了,因?yàn)镻erson類中編寫了拷貝構(gòu)造函數(shù),導(dǎo)致無(wú)法生成默認(rèn)的構(gòu)造函數(shù),因?yàn)槟J(rèn)構(gòu)造函數(shù)生成的條件是沒(méi)有構(gòu)造函數(shù),而拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù)。
int main()
{
?? ?Person s; //沒(méi)有合適的默認(rèn)構(gòu)造函數(shù)可用
?? ?return 0;
}
這時(shí)我們就可以使用default關(guān)鍵字強(qiáng)制生成默認(rèn)的構(gòu)造函數(shù),如下:
class Person
{
public:
?? ?Person() = default; //強(qiáng)制生成默認(rèn)構(gòu)造函數(shù)
?? ?//拷貝構(gòu)造函數(shù)
?? ?Person(const Person& p)
?? ??? ?:_name(p._name)
?? ??? ?, _age(p._age)
?? ?{}
private:
?? ?F::string _name;
?? ?int _age; ? ? ? ?
};
注意: 默認(rèn)成員函數(shù)都可以用default關(guān)鍵字強(qiáng)制生成,包括移動(dòng)構(gòu)造和移動(dòng)賦值。
禁止生成默認(rèn)函數(shù)的關(guān)鍵字delete
當(dāng)我們不希望某些默認(rèn)函數(shù)生成時(shí),比如某個(gè)類不期望被拷貝怎么辦呢?
在C++98中,我們可以私有化拷貝構(gòu)造的聲明,占住拷貝構(gòu)造的地即可,目的是為了不讓編譯器默認(rèn)生成,注意無(wú)需實(shí)現(xiàn)拷貝構(gòu)造定義。
在C++11中,我們可以在該函數(shù)聲明后面加上=delete,表示讓編譯器不生成該函數(shù)的默認(rèn)版本,我們將=delete修飾的函數(shù)稱為『 刪除函數(shù)』。
class Person
{
public:
Person(const char* name = "", int age = 0)
:_name(name)
, _age(age)
{}
Person(const Person& p) = delete;
private:
bit::string _name;
int _age;
};
int main()
{
Person s1;
Person s2 = s1;
Person s3 = std::move(s1);
return 0;
}
final 和 override 關(guān)鍵字
final
1.修飾虛函數(shù),表示該虛函數(shù)不能再被重寫;
class Car
{
public:
?? ?virtual void Drive() final {}
};
class Benz :public Car
{
public:
?? ?virtual void Drive() { cout << "Benz-舒適" << endl; } //err
};
2.修飾類,該類不能被繼承
override
override的作用是讓編譯器幫助用戶檢查子類虛函數(shù)是否重寫了父類某個(gè)虛函數(shù),如果沒(méi)有重寫編譯報(bào)錯(cuò),override作用發(fā)生在編譯時(shí)。
class Car {
public:
?? ?virtual void Drive() {}
};
class Benz :public Car
{
public:
?? ?virtual void Drive() override { cout << "Benz-舒適" << endl; }
};
?=========================================================================
如果你對(duì)該系列文章有興趣的話,歡迎持續(xù)關(guān)注博主動(dòng)態(tài),博主會(huì)持續(xù)輸出優(yōu)質(zhì)內(nèi)容
??博主很需要大家的支持,你的支持是我創(chuàng)作的不竭動(dòng)力??
??~ 點(diǎn)贊收藏+關(guān)注 ~??文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-854746.html
=========================================================================
到了這里,關(guān)于【C++】C++11類的新功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!