一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++11新的類(lèi)功能(特殊成員函數(shù)、override和final)

冬至子 ? 來(lái)源:iDoitnow ? 作者:艱默 ? 2023-07-18 16:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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,其不可以被派生
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50228
  • C++語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    7303
  • 運(yùn)算符
    +關(guān)注

    關(guān)注

    0

    文章

    173

    瀏覽量

    11484
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    使用C++11新特性實(shí)現(xiàn)一個(gè)通用的線(xiàn)程池設(shè)計(jì)

    C++11標(biāo)準(zhǔn)之前,多線(xiàn)程編程只能使用pthread_xxx開(kāi)頭的一組POSIX標(biāo)準(zhǔn)的接口。從C++11標(biāo)準(zhǔn)開(kāi)始,多線(xiàn)程相關(guān)接口封裝在了C++的std命名空間里。
    的頭像 發(fā)表于 12-22 13:58 ?1989次閱讀
    使用<b class='flag-5'>C++11</b>新特性實(shí)現(xiàn)一個(gè)通用的線(xiàn)程池設(shè)計(jì)

    vc的常用類(lèi)成員函數(shù)

    CRect:用來(lái)表示矩形的類(lèi),擁有四個(gè)成員變量:top left bottom right。分別表是左上角和右下角的坐標(biāo)??梢酝ㄟ^(guò)以下的方法構(gòu)造:
    發(fā)表于 08-02 06:33

    類(lèi)成員函數(shù)中const的使用,有什么注意事項(xiàng)?

    類(lèi)成員函數(shù)中const的使用,有什么注意事項(xiàng)?
    發(fā)表于 04-26 06:42

    如何在rt-thread的env環(huán)境中配置C++11?

    1、rt-thread的env環(huán)境是否支持C++112、如何在rt-thread的env環(huán)境中配置C++11
    發(fā)表于 05-06 09:52

    類(lèi)成員函數(shù)與普通函數(shù)的區(qū)別研究

    本文的目的是研究類(lèi)成員函數(shù)與普通函數(shù)之區(qū)別,以及不同調(diào)用方式之間的區(qū)別,進(jìn)而通過(guò)內(nèi)聯(lián)匯編語(yǔ)句模仿特定的調(diào)用,從而完成通過(guò)普通函數(shù)指針調(diào)用
    發(fā)表于 09-15 14:52 ?32次下載

    final關(guān)鍵字的用法

    在Java中,final關(guān)鍵字可以用來(lái)修飾類(lèi)、方法和變量(包括成員變量和局部變量)。下面就從這三個(gè)方面來(lái)了解一下final關(guān)鍵字的基本用法。 1.修飾
    發(fā)表于 09-27 10:36 ?0次下載
    <b class='flag-5'>final</b>關(guān)鍵字的用法

    《深入理解C++11C++11新特性解析與應(yīng)用的詳細(xì)電子教材免費(fèi)下載

    國(guó)內(nèi)首本全面深入解讀 C++11 新標(biāo)準(zhǔn)的專(zhuān)著,由 C++ 標(biāo)準(zhǔn)委員會(huì)代表和 IBM XL 編譯器中國(guó)開(kāi)發(fā)團(tuán)隊(duì)共同撰寫(xiě)。不僅詳細(xì)闡述了 C++11 標(biāo)準(zhǔn)的設(shè)計(jì)原則,而且系統(tǒng)地講解了 C++11
    發(fā)表于 08-27 08:00 ?0次下載

    C++:詳談構(gòu)造函數(shù)

    構(gòu)造函數(shù)是一個(gè)特殊成員函數(shù),名字與類(lèi)名相同,創(chuàng)建類(lèi)類(lèi)型對(duì)象的時(shí)候,由編譯器自動(dòng)調(diào)用,在對(duì)象的生
    的頭像 發(fā)表于 06-29 11:44 ?1982次閱讀
    <b class='flag-5'>C</b>++:詳談構(gòu)造<b class='flag-5'>函數(shù)</b>

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

    EE-128:C++中的DSP:從C++調(diào)用匯編類(lèi)成員函數(shù)
    發(fā)表于 04-16 17:04 ?2次下載
    EE-128:<b class='flag-5'>C</b>++中的DSP:從<b class='flag-5'>C</b>++調(diào)用匯編<b class='flag-5'>類(lèi)</b><b class='flag-5'>成員</b><b class='flag-5'>函數(shù)</b>

    類(lèi)的申明和成員函數(shù)定義分離是什么

    前面我們學(xué)習(xí)了如何定義類(lèi),以及如何使用類(lèi)成員,在前面我們把成員函數(shù)都定義在了類(lèi)的內(nèi)部,接下來(lái)我
    的頭像 發(fā)表于 02-27 15:33 ?1318次閱讀

    淺談C++的mutable關(guān)鍵字

    C++11中推出了一種特殊的關(guān)鍵字:mutable用于修飾類(lèi)變量。它的作用是標(biāo)注該變量一定會(huì)被修改,因此也就不是const類(lèi)型。目的是為了使這些成員變量在被const關(guān)鍵字修飾的
    的頭像 發(fā)表于 04-15 11:13 ?4128次閱讀

    函數(shù)結(jié)構(gòu)的定義和例程說(shuō)明

    在理解拷貝構(gòu)造函數(shù)前,還是有必要回顧下類(lèi)的構(gòu)造函數(shù)基本概念。類(lèi)的構(gòu)造函數(shù)是一種特殊
    的頭像 發(fā)表于 04-19 11:35 ?1392次閱讀

    8533-11 Final 數(shù)據(jù)表

    8533-11 Final 數(shù)據(jù)表
    發(fā)表于 07-11 19:58 ?0次下載
    8533-<b class='flag-5'>11</b> <b class='flag-5'>Final</b> 數(shù)據(jù)表

    重點(diǎn)了解一下C++11 包裝器function

    C++提供了多個(gè)包裝器,它們主要是為了給其他編程接口提供更一致或更合適的接口。C++11提供了多個(gè)包裝器,這里我們重點(diǎn)了解一下包裝器function。
    的頭像 發(fā)表于 07-18 16:41 ?730次閱讀

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

    電子發(fā)燒友網(wǎng)站提供《EE-128:C語(yǔ)言中的DSP:從C調(diào)用匯編類(lèi)成員函數(shù).pdf》資料免費(fèi)下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b>語(yǔ)言中的DSP:從<b class='flag-5'>C</b>調(diào)用匯編<b class='flag-5'>類(lèi)</b><b class='flag-5'>成員</b><b class='flag-5'>函數(shù)</b>