亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

c++11?類中關(guān)于default、explict、implicit、noexcept、final的詳解

 更新時間:2021年11月16日 11:28:49   作者:17歲boy想當攻城獅  
這篇文章主要介紹了c++11?類中關(guān)于default、explict、implicit、noexcept、final的詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

default

default是c++11的標準,它的作用是告訴編譯器聲明一個無參的默認構(gòu)造函數(shù)。

最初的時候我們聲明類是這樣的:

class test{
    
    public:
        int add(){}
};

由于我們沒有給默認構(gòu)造函數(shù),c++編譯器隱式的幫我們增加了一個默認的無參構(gòu)造函數(shù),注意這一點取決于編譯,有的編譯器不會增加,但大多數(shù)都會,如GCC、MSVC。

但是一旦我們聲明了一個有參的構(gòu)造函數(shù):

class test{
    
    public:
        test(int a){}
        int add(){}
};

那么編譯器就不會為我們提供默認的無參構(gòu)造函數(shù)了,就會在聲明變量時必須傳入?yún)?shù)了。

所以誕生了default關(guān)鍵字,只需要在無參的構(gòu)造函數(shù)后面加上它就可以了

class test{
    
    public:
        test() = default;
        test(int a){}
        int add(){}
};

那么問題來了,它和我們手動聲明無參構(gòu)造函數(shù)有什么區(qū)別?

區(qū)別一:當使用多文件編程時,使用default聲明的構(gòu)造函數(shù)不需要在寫實現(xiàn)

區(qū)別二:代碼執(zhí)行效率,當我們使用這個關(guān)鍵字定義的構(gòu)造函數(shù),在聲明變量時,編譯器不會去調(diào)用構(gòu)造函數(shù),也不會生成構(gòu)造函數(shù)的代碼,這點是重點,高效率提高聲明變量的時間,如果用戶自己聲明了構(gòu)造函數(shù)會造成編譯器開辟完內(nèi)存后會去調(diào)用一次構(gòu)造函數(shù)。

explict

這個關(guān)鍵字的作用是用于修飾只有一個參數(shù)的構(gòu)造函數(shù),并要求為顯示的

那么顯示的是什么意思呢?為什么只能修飾一個構(gòu)造函數(shù)呢?

首先我們來看這段代碼

class test{
    
    public:
        test(int a){}
};
 
int main(){
 
    test a(0);
    test b = 2;
}

大家可以看到上面用了兩種方式的初始化,一種是(),還有一種是=號,注意這里講一下區(qū)別在哪,()構(gòu)造會直接調(diào)用最匹配的構(gòu)造函數(shù),并且不會發(fā)送隱式轉(zhuǎn)換,如果用=號則編譯器需要推導,推導=號右邊是一個什么類型,然后去選擇與這個類型匹配的構(gòu)造函數(shù)

但是也可能產(chǎn)生一種問題:

class test{
    
    public:
        test(int a){}
        test(char a){}
};
 
int main(){
 
    test a(0);
    test b = 2;
}

這里增加了一個參數(shù)char的構(gòu)造函數(shù),那么這個時候可能產(chǎn)生一種問題,就是char是可以用來表示整數(shù)的,而2又符合char能表示的范圍,所以這里就可能產(chǎn)生了隱式轉(zhuǎn)換,將2轉(zhuǎn)換為了char類型,我們用戶甚至可以手動強轉(zhuǎn),如果編譯器夠聰明的話會選擇正確的構(gòu)造函數(shù),如果不夠聰明呢?

所以為了解決可能產(chǎn)生的這種問題就推出了:explict關(guān)鍵字,用這個關(guān)鍵字聲明的構(gòu)造函數(shù)是不允許用戶去做可能產(chǎn)生隱式轉(zhuǎn)換的事情

class test{
    
    public:
        explict test(int a){}
        test(char a){}
};
 
int main(){
 
    test a(0);
    test b = 2;    //這一行會報錯,因為可能會發(fā)生隱式轉(zhuǎn)換
    //test b = '2' //這樣也不行的,因為會優(yōu)先匹配具有explict的構(gòu)造函數(shù),那么這樣就產(chǎn)生了隱式轉(zhuǎn)換,因為'2'可以被轉(zhuǎn)換成ascii碼
}

因為有了explict關(guān)鍵字的存在任何可能發(fā)生隱式轉(zhuǎn)換的動作都會被編譯器報錯,但是如果你用()來調(diào)用就沒事的

test b('c') ;

因為()會明確表示入?yún)㈩愋停?號的話編譯器是需要推導=號左右兩邊類型,在去調(diào)用最合適的構(gòu)造函數(shù),那么這個時候就產(chǎn)生了可能發(fā)生隱式轉(zhuǎn)換的問題。

同時=號初始化也會拖累編譯速度,最后明確一點,就是順序,當調(diào)用時編譯器會優(yōu)先匹配explict的構(gòu)造函數(shù),就如剛剛的test b = '2',已經(jīng)明確是char符號了,但是編譯器仍然認為它可能會出現(xiàn)隱式轉(zhuǎn)換,因為使用explict關(guān)鍵字后你做的任何可能產(chǎn)生類型轉(zhuǎn)換的操作都會被編譯器優(yōu)先裁決。

最后在說明一點就是為什么只能用于只有一個參數(shù)的構(gòu)造函數(shù),為什么不能是多個?

答:因為多個的情況下是無法明確類型的,如果參數(shù)有兩個或兩個以上的情況下,編譯器這樣是不好推斷的,因為兩個變量可能是不同的類型,如果是兩個不同的類型,那就不能做類型限定,其次類型較多的情況下對于編譯器來說也是一種負擔。

explict的意義就是在于針對一個變量的構(gòu)造函數(shù)時方式那一個參數(shù)類型出現(xiàn)隱式轉(zhuǎn)換,這個是與開發(fā)者們有關(guān),最初開發(fā)者們寫了多個只有一個參數(shù)的構(gòu)造函數(shù)時,有時會發(fā)生隱式轉(zhuǎn)換導致調(diào)不到理想的構(gòu)造函數(shù),但是多個參數(shù)的構(gòu)造函數(shù)因為類型會更明確一點,所以不會出現(xiàn)這樣的問題。

implicit

這個關(guān)鍵字其實根explict是相反的,它其實不存在于c++,只在java和c#這樣繼承c++特性的語言里存在,它表明的是隱藏的,就是表明構(gòu)造函數(shù)可以被隱式轉(zhuǎn)換,只是后來人們把沒有使用explict聲明的只有一個參數(shù)的構(gòu)造函數(shù)都認為隱式帶了一個implicit,不知道是誰提的,就挺離譜的,java和c#明明是繼承c++,但是后來人們?nèi)堰@個類型隱式加到c++中。

noexcept

這是c++11增加的函數(shù),目的是為了提升函數(shù)效率,即告訴編譯器這個函數(shù)不會產(chǎn)生異常。

首先開發(fā)者們在給函數(shù)加上這個關(guān)鍵字時應明確,你的這個函數(shù)不會出現(xiàn)任何問題

class test{
    
    public:
        explict test(int a)noexcept {}
       
};

這里異常的意思是指:段錯誤和任何可能引起程序崩潰的代碼。

c++里有一套機制,就是c++好像對系統(tǒng)層的某些異常做了捕獲,當我們使用std::string,在初始化時傳入一個NULL時會導致段錯誤,然后系統(tǒng)會殺死程序,但我發(fā)現(xiàn)在殺死之前會先去調(diào)用c++的std::terminate(),然后這個函數(shù)內(nèi)部調(diào)用std::abort()來殺死我們的程序,在Linux中有消息事件可以完成這個操作。

所以我認為這個關(guān)鍵字的作用就是告訴編譯器不要對這個函數(shù)做監(jiān)聽,這樣就可以提升函數(shù)的執(zhí)行效率,否則當調(diào)用這個函數(shù)時c++還要去做一些事件監(jiān)聽的注冊功能,因為如果一開始全都監(jiān)聽的話c++也不知道你什么時候才會調(diào)用,所以最合適的是調(diào)用的時候監(jiān)聽。

那么這樣的話就提升了函數(shù)調(diào)用時的一個速度。

final

這個關(guān)鍵字很容易理解,它就是聲明這個類不能被繼承。

class test final{
    
       
};
 
//這行會報錯,因為test不能被繼承
class test_son : public test{
 
}

那么還有一個用處,就是用在虛函數(shù)上,表示不能被重寫

class test{
    
    public:
        vritual int add(int a) final{}
       
};

子類繼承以后就不能重寫test虛函數(shù)add了,用來限定一些方法,如基類指向子類指針時,如果子類重寫了(即同名函數(shù))該方法,那么父類會優(yōu)先調(diào)用子類,這樣的話就是限定子類的某些行為,達到使用父類指針指向子類這樣的多態(tài)性寫法時,永遠只能調(diào)用父類的這個方法。

到此這篇關(guān)于c++11 類中關(guān)于default、explict、implicit、noexcept、final的詳解的文章就介紹到這了,更多相關(guān)c++11 類default、explict、implicit、noexcept、final內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實現(xiàn)停車場管理系統(tǒng)

    C語言實現(xiàn)停車場管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)停車場管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • opencv?C++模板匹配的簡單實現(xiàn)

    opencv?C++模板匹配的簡單實現(xiàn)

    這篇文章主要介紹了opencv?C++模板匹配的簡單實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • QT編寫地圖實現(xiàn)在線輪廓圖的示例代碼

    QT編寫地圖實現(xiàn)在線輪廓圖的示例代碼

    輪廓圖也叫行政區(qū)劃,這里的輪廓圖是指百度地圖的區(qū)域輪廓圖。本文將為大家介紹QT如何實現(xiàn)在線輪廓圖的編寫,感興趣的小伙伴可以跟隨小編一起學習一下
    2021-12-12
  • C++簡單實現(xiàn)shared_ptr的代碼

    C++簡單實現(xiàn)shared_ptr的代碼

    智能指針用于資源管理,為了保證資源的操作得到順利的執(zhí)行防止資源泄露,因此大多數(shù)實現(xiàn)都以noexcept在參數(shù)列表后聲明為不拋出異常,這篇文章主要介紹了C++簡單實現(xiàn)shared_ptr的代碼,需要的朋友可以參考下
    2022-09-09
  • VScode編譯C++ 頭文件顯示not found的問題

    VScode編譯C++ 頭文件顯示not found的問題

    這篇文章主要介紹了VScode編譯C++ 頭文件顯示not found的問題,本文給大家分享問題解決方法,通過截圖的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2020-03-03
  • opencv實現(xiàn)圖形輪廓檢測

    opencv實現(xiàn)圖形輪廓檢測

    這篇文章主要為大家詳細介紹了opencv實現(xiàn)圖形輪廓檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Cocos2d-x UI開發(fā)之文本類使用實例

    Cocos2d-x UI開發(fā)之文本類使用實例

    這篇文章主要介紹了Cocos2d-x學習筆記之文本類,文本類是UI開發(fā)中經(jīng)常使用的,本文用詳細的代碼注釋講解了文本類的使用,需要的朋友可以參考下
    2014-09-09
  • 利用C++實現(xiàn)從std::string類型到bool型的轉(zhuǎn)換

    利用C++實現(xiàn)從std::string類型到bool型的轉(zhuǎn)換

    利用C++實現(xiàn)從std::string類型到bool型的轉(zhuǎn)換。需要的朋友可以過來參考下。希望對大家有所幫助
    2013-10-10
  • 詳解C++程序中定義struct結(jié)構(gòu)體的方法

    詳解C++程序中定義struct結(jié)構(gòu)體的方法

    C++中同樣擁有C語言中的結(jié)構(gòu)體,下面就來詳解C++程序中定義struct結(jié)構(gòu)體的方法,需要的朋友可以參考下
    2016-05-05
  • C語言中查找字符在字符串中出現(xiàn)的位置的方法

    C語言中查找字符在字符串中出現(xiàn)的位置的方法

    這篇文章主要介紹了C語言中查找字符在字符串中出現(xiàn)的位置的方法,分別是strchr()函數(shù)和strrchr()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08

最新評論