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

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

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

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

冬至子 ? 來源:iDoitnow ? 作者:艱默 ? 2023-07-18 16:02 ? 次閱讀

1. 特殊的成員函數(shù)

C++11在原有的4個特殊成員函數(shù)(默認構(gòu)造函數(shù)、復制構(gòu)造函數(shù)、復制賦值運算符和析構(gòu)函數(shù))的基礎上新增了移動構(gòu)造函數(shù)和移動賦值運算符。這些特殊成員函數(shù)在各種情況下是會通過編譯器自動提供的。

  • 默認構(gòu)造函數(shù) :如果未定義任何構(gòu)造函數(shù),編譯器將提供一個默認構(gòu)造函數(shù),對于類成員則調(diào)用其默認構(gòu)造函數(shù)(對于內(nèi)置的成員,默認構(gòu)造函數(shù)不對其進行初始化。如果使用者提供了移動構(gòu)造函數(shù),編譯器將不會自動提供默認構(gòu)造函數(shù))。
  • 復制構(gòu)造函數(shù) :如果未定義復制構(gòu)造函數(shù),而代碼有需要使用它,編譯器將提供一個默認的復制構(gòu)造函數(shù)。(如果使用者提供了類的移動構(gòu)造函數(shù)的情況下,編譯器將不會自動提供復制構(gòu)造函數(shù))
  • 移動構(gòu)造函數(shù) :如果未定義移動構(gòu)造函數(shù),而代碼有需要使用它,編譯器將提供一個默認的移動構(gòu)造函數(shù)。(如果使用者提供了類的析構(gòu)函數(shù)、復制構(gòu)造函數(shù)、復制賦值運算符或移動賦值運算符的情況下,編譯器將不會自動提供移動構(gòu)造函數(shù))
  • 復制賦值運算符 :如果未定義復制賦值運算符,而代碼有需要使用它,編譯器將提供一個默認的復制賦值運算符。(如果使用者提供了移動賦值運算符,編譯器不會自動提供復制賦值運算符)
  • 移動賦值運算符 :如果未定義移動賦值運算符,而代碼有需要使用它,編譯器將提供一個默認的移動賦值運算符。(如果使用者提供了復制構(gòu)造函數(shù)、移動構(gòu)造函數(shù)、復制賦值運算符或析構(gòu)函數(shù),編譯器不會自動提供移動賦值運算符)

當用戶在定義某些特殊函數(shù)后,導致另外某個特殊函數(shù)不會自動創(chuàng)建,這時候用戶仍可以使用關(guān)鍵詞 default 強制編譯器生成隱式聲明的目標特殊成員函數(shù)函數(shù)。例如用戶定義了移動構(gòu)造函數(shù),編譯器不會自動構(gòu)建默認構(gòu)造函數(shù)、復制構(gòu)造函數(shù)和復制賦值運算符,這種情況下我們可以通過default強制編譯器創(chuàng)建這些方法的默認版本:

class A{
    public:
    A(A &&);
    A() = default;
    A(const A&) = default;
    A & operator = (const A&) = default;
};

同時,有些時候,我們不希望編譯器為我們提供某個特殊的成員函數(shù)默認版本,我們可以使用關(guān)鍵字delete來禁止編譯器使用特定方法。 關(guān)鍵字default只能用于這個6個特殊的成員數(shù)(默認構(gòu)造函數(shù)、復制構(gòu)造函數(shù)、復制賦值運算符、移動構(gòu)造函數(shù)、移動賦值運算符和析構(gòu)函數(shù)),但delete可以用于任何成員函數(shù) 。例如:

class A{
    public:
    A() = delete;//禁止編譯器生成默認構(gòu)造函數(shù)
    void readDoubleNum(double);
}

class B{
    public:
    B() = delete;//禁止編譯器生成默認構(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,進而執(zhí)行readDoubleNum(double)方法

B b;
b.readDoubleNum(5.0);
b.readDoubleNum(5);//錯誤,其與readDoubleNum(int)原型匹配,編譯器檢測到該方法被禁用后,在編譯階段就會報錯,防止int到double的特定轉(zhuǎn)換

2. override和final

  • override標識符
    override說明符的作用是用來指定一個虛函數(shù)覆蓋另外一個虛函數(shù)。其用法如下:

    class A{
        virtual void fun();
        ...
    };
    
    class B : A{
        void fun() override;//B::fun將覆蓋A::fun
        ...
    };
    

    C++11引入override標識符的目的就是為了在重寫基類的方法時候,防止重寫方法的類型、名稱和參數(shù)列表因為人為因素造成其與基類的不一致,無法使用多態(tài)。使用override標識符將重寫的檢查工作(重寫方法的類型、名稱和參數(shù)列表要與基類的保持一致)交給編譯器處理,減少人為出錯的可能。

  • final標識符

final標識符的作用是指定某個虛函數(shù)不能在派生類中被覆蓋,或者某個類不能被派生。其使用方法如下:

calss A{
    virtual void fun();
};

class B : A{
    void fun() final;//A::fun被覆蓋,而且B::fun是最終被覆蓋函數(shù)
    void ba() final;//錯誤,ba非虛函數(shù),因此它不能是final
};

class C final: B{//C為final
    void fun() override;//錯誤,fun不能被覆蓋,因為其在B中為final
};

class D : C{};//錯誤,因為類C位final,其不可以被派生
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1602

    瀏覽量

    48896
  • C++語言
    +關(guān)注

    關(guān)注

    0

    文章

    147

    瀏覽量

    6931
  • 運算符
    +關(guān)注

    關(guān)注

    0

    文章

    166

    瀏覽量

    11013
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    vc的常用成員函數(shù)

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

    成員函數(shù)中const的使用,有什么注意事項?

    成員函數(shù)中const的使用,有什么注意事項?
    發(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

    C++中的私有函數(shù)消除方法

    私有訪問是 C++ 中三種訪問權(quán)限的一種,是訪問權(quán)限中最嚴格的。對象的私有成員分私有函數(shù)和私有數(shù)據(jù)兩部分,其中私有數(shù)據(jù)有特殊的作用;但是私
    發(fā)表于 06-29 15:45 ?38次下載
    <b class='flag-5'>C</b>++中的私有<b class='flag-5'>函數(shù)</b>消除方法

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

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

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

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

    《深入理解C++11C++11新特性解析與應用的詳細電子教材免費下載

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

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

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

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

    EE-128:C++中的DSP:從C++調(diào)用匯編成員函數(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'>類</b><b class='flag-5'>成員</b><b class='flag-5'>函數(shù)</b>

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

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

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

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

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

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

    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ù)表

    重點了解一下C++11 包裝器function

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