国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - c++11 類中關于default、explict、implicit、noexcept、final的詳解

c++11 類中關于default、explict、implicit、noexcept、final的詳解

2022-02-23 14:0617歲boy想當攻城獅 C/C++

這篇文章主要介紹了c++11 類中關于default、explict、implicit、noexcept、final的詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

default

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

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

?
1
2
3
4
5
class test{
    
    public:
        int add(){}
};

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

但是一旦我們聲明了一個有參的構造函數:

?
1
2
3
4
5
6
class test{
    
    public:
        test(int a){}
        int add(){}
};

那么編譯器就不會為我們提供默認的無參構造函數了,就會在聲明變量時必須傳入參數了。

所以誕生了default關鍵字,只需要在無參的構造函數后面加上它就可以了

?
1
2
3
4
5
6
7
class test{
    
    public:
        test() = default;
        test(int a){}
        int add(){}
};

那么問題來了,它和我們手動聲明無參構造函數有什么區別?

區別一:當使用多文件編程時,使用default聲明的構造函數不需要在寫實現

區別二:代碼執行效率,當我們使用這個關鍵字定義的構造函數,在聲明變量時,編譯器不會去調用構造函數,也不會生成構造函數的代碼,這點是重點,高效率提高聲明變量的時間,如果用戶自己聲明了構造函數會造成編譯器開辟完內存后會去調用一次構造函數。

explict

這個關鍵字的作用是用于修飾只有一個參數的構造函數,并要求為顯示的

那么顯示的是什么意思呢?為什么只能修飾一個構造函數呢?

首先我們來看這段代碼

?
1
2
3
4
5
6
7
8
9
10
11
class test{
    
    public:
        test(int a){}
};
 
int main(){
 
    test a(0);
    test b = 2;
}

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

但是也可能產生一種問題:

?
1
2
3
4
5
6
7
8
9
10
11
12
class test{
    
    public:
        test(int a){}
        test(char a){}
};
 
int main(){
 
    test a(0);
    test b = 2;
}

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

所以為了解決可能產生的這種問題就推出了:explict關鍵字,用這個關鍵字聲明的構造函數是不允許用戶去做可能產生隱式轉換的事情

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class test{
    
    public:
        explict test(int a){}
        test(char a){}
};
 
int main(){
 
    test a(0);
    test b = 2;    //這一行會報錯,因為可能會發生隱式轉換
    //test b = '2' //這樣也不行的,因為會優先匹配具有explict的構造函數,那么這樣就產生了隱式轉換,因為'2'可以被轉換成ascii碼
}

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

test b('c') ;

因為()會明確表示入參類型,=號的話編譯器是需要推導=號左右兩邊類型,在去調用最合適的構造函數,那么這個時候就產生了可能發生隱式轉換的問題。

同時=號初始化也會拖累編譯速度,最后明確一點,就是順序,當調用時編譯器會優先匹配explict的構造函數,就如剛剛的test b = '2',已經明確是char符號了,但是編譯器仍然認為它可能會出現隱式轉換,因為使用explict關鍵字后你做的任何可能產生類型轉換的操作都會被編譯器優先裁決。

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

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

explict的意義就是在于針對一個變量的構造函數時方式那一個參數類型出現隱式轉換,這個是與開發者們有關,最初開發者們寫了多個只有一個參數的構造函數時,有時會發生隱式轉換導致調不到理想的構造函數,但是多個參數的構造函數因為類型會更明確一點,所以不會出現這樣的問題。

implicit

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

noexcept

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

首先開發者們在給函數加上這個關鍵字時應明確,你的這個函數不會出現任何問題

?
1
2
3
4
5
6
class test{
    
    public:
        explict test(int a)noexcept {}
       
};

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

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

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

那么這樣的話就提升了函數調用時的一個速度。

final

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

?
1
2
3
4
5
6
7
8
9
class test final{
    
       
};
 
//這行會報錯,因為test不能被繼承
class test_son : public test{
 
}

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

?
1
2
3
4
5
6
class test{
    
    public:
        vritual int add(int a) final{}
       
};

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

到此這篇關于c++11 類中關于default、explict、implicit、noexcept、final的詳解的文章就介紹到這了,更多相關c++11 類default、explict、implicit、noexcept、final內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/bjbz_cxy/article/details/121324516

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
主站蜘蛛池模板: 日本一区二区精品 | 亚洲高清在线 | 欧美一区三区 | 国产精品欧美日韩在线观看 | 久久久一区二区 | 日韩欧美在线看 | 中文日韩av| 国产一区二区免费视频 | 日韩成人在线播放 | 久久国产亚洲精品 | 国产精品五区 | 天堂中文资源在线 | 91精品国产一区二区三区四区在线 | 精品国产乱码久久久久久1区2区 | 黄视频在线 | aaa黄色片| 日韩成人在线电影 | 国产精品久久久久久久久久久久久 | 一本久久久 | 羞羞视频免费网站 | 日韩免费在线观看视频 | 久久精品无码一区二区三区 | 午夜精品一区二区三区在线视频 | 一级片黄色免费 | 亚州精品国产 | 九九精品视频在线观看 | 午夜精品影院 | 一区二区三区精品视频 | 在线免费黄色 | 欧美久久久 | 亚洲久久久久 | 一区二区三区精品 | 一区二区三区四区在线视频 | 欧美视频在线免费 | 最近高清无吗免费看 | 精品在线一区二区三区 | 国产精品视频导航 | 看黄免费在线 | 亚洲日本乱码在线观看 | 亚洲一区二区三区在线免费观看 | 亚洲国产精品美女 |