最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 之explicit關鍵字

 更新時間:2023年04月09日 09:05:16   作者:烽起黎明  
今天我們來談談C++中的explicit關鍵字,這篇文章詳細介紹了C語言的關鍵字explicit關鍵字,本文有詳細的代碼實例,感興趣的同學可以借鑒參考

??構造函數(shù)不僅可以構造與初始化對象,對于單個參數(shù)或者除第一個參數(shù)無默認值其余均有默認值的構造函數(shù),還具有類型轉換的作用

一、單參構造函數(shù)

  • 還是老朋友,我們通過下面這個日期類進行講解
class Date
{
public:
	Date(int year)
		:_year(year)
	{}

private:
	int _year;
	int _month = 3;
	int _day = 31;
};

對于下面的d1很清楚一定是調(diào)用了有參構造進行初始化,不過對于d2來說,也是一種構造方式

int main()
{
	Date d1(2022);
	Date d2 = 2023;
	
	return 0;
}

依舊通過調(diào)試來看就會非常清晰,這種寫法也會去調(diào)用構造函數(shù)

在這里插入圖片描述

在操作符章節(jié),我有提到過【隱式類型轉換】這個概念,像下面將一個int類型的數(shù)值賦值給到一個double類型的數(shù)據(jù),此時就會產(chǎn)生一個隱式類型轉換

int i = 1;
double d = i;
  • 對于類型轉換而言,我在C++引用一文中也有提到過,這里并不是將值直接賦值給到左邊的對象,而是在中間呢會產(chǎn)生一個臨時變量,例如右邊的這個i會先去構造一個臨時變量,這個臨時變量的類型是[double]。把它里面的值初始化為1,然后再通過這個臨時對象進行拷貝構造給d,這就是編譯器會做的一件事
  • 那對于這個d2其實也是一樣,2023會先去構造一個臨時對象,這個臨時對象的類型是[Date]把它里面的year初始化為2023,然后再通過這個臨時對象進行拷貝構造給到d2,

在這里插入圖片描述

??小陳:不是說構造函數(shù)有初始化列表嗎?拷貝構造怎么去初始化呢?

//拷貝構造
Date(const Date& d)
	:_year(d._year)
	,_month(d._month)
	,_day(d._day)
{}

同學,別忘了【拷貝構造】也是屬于構造函數(shù)的一種哦,也是會有初始化列表的

剛才說到了中間會產(chǎn)生一個臨時對象,而且會調(diào)用構造 + 拷貝構造,那此時我們在Date類中寫一個拷貝構造函數(shù),調(diào)試再去看看會不會去進行調(diào)用

  • 很明顯沒有,我在進入Date類后一直在按F11,但是卻進不到拷貝構造中,這是為什么呢?

在這里插入圖片描述

  • 原因其實在于編譯器在這里地方做了一個優(yōu)化,將【構造 + 拷貝構造】優(yōu)化成了【一個構造】,因為編譯器在這里覺得構造再加拷貝構造太費事了,干脆就合二為一了。其實對于這里的優(yōu)化不同編譯器是有區(qū)別的,像一下VC++、DevC++可能就不會去優(yōu)化,越是新的編譯器越可能去進行這種優(yōu)化。在本文的最后一個模塊我還會詳細展開分析

??小葉:但您是怎么知道中間賦值這一塊產(chǎn)生了臨時對象呢?如果不清楚編譯器的優(yōu)化機制這一塊肯定就會認為這里只有一個構造

  • 這點確實是,若是我現(xiàn)在不是直接賦值了,而是去做一個引用,此時會發(fā)生什么呢?
Date& d3 = 2024;

可以看到,報出了一個錯誤,原因就在于d3是一個Date類型,2024則是一個內(nèi)置類型的數(shù)據(jù)

在這里插入圖片描述

  • 但若是我在前面加一個const做修飾后,就不會出現(xiàn)問題了,這是為什么呢?

在這里插入圖片描述

其實這里的真正原因就在于產(chǎn)生的這個【臨時變量】,它就是通過Date類的構造函數(shù)構造出來的,同類型之間可以做引用。還有一點就是臨時變量具有常性,所以給到一個const類型修飾對象不會有問題

但若是你不想讓這種隱式類型轉換發(fā)生怎么辦呢?此時就可以使用到C++中的一個關鍵字叫做explicit

  • 它加在構造函數(shù)的前面進行修飾,有了它就不會發(fā)生上面的這一系列事兒了,它會【禁止類型轉換】
explicit Date(int year)
	:_year(year)
{}

在這里插入圖片描述

二、多參構造函數(shù)

對于上面所講的都是基于單參的構造函數(shù),接下去我們來瞧瞧多參的構造函數(shù)

//多參構造函數(shù)
Date(int year, int month ,int day = 31)
	:_year(year)
	,_month(month)
	,_day(day)
{}
  • 根據(jù)從右往左缺省的規(guī)則,我們在初始化構造的時候要給到2個參數(shù),d1沒有問題傳入了兩個參數(shù),但是若是像上面那樣沿襲單參構造函數(shù)這么去初始化還行得通嗎?很明顯不行,編譯器報出了錯誤

在這里插入圖片描述


??小馮:那要怎么辦呀,對于一定要傳入多參數(shù)進行構造的場景

這個時候就要使用到我們C++11中的新特性了,在對多參構造進行初始化的時候在外面加上一個{}就可以了,可能你覺得這種寫法像是C語言里面結構體的初始化,但實際不是,而是在調(diào)用多參構造函數(shù)

Date d2 = { 2023, 3 };

在這里插入圖片描述

  • 不僅如此,對于下面這種也同樣適用,調(diào)用構造去產(chǎn)生一個臨時對象
const Date& d3 = {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--> 2024, 4 };

那要如何去防止這樣的隱式類型轉換發(fā)生呢,還是可以使用到explicit關鍵字嗎?

//多參構造函數(shù)
explicit Date(int year, int month ,int day = 31)
	:_year(year)
	,_month(month)
	,_day(day)
{}
  • 可以看到,加上explicit關鍵字做修飾,同樣可以起到【禁止類型轉換】的作用

在這里插入圖片描述

  • 還有一種例外,當缺省參數(shù)從右往左給到兩個的時候,此時只需要傳入一個實參即可,那也就相當于是單參構造explicit關鍵字依舊可以起到作用·
explicit Date(int year, int month = 3,int day = 31)
	:_year(year)
	,_month(month)
	,_day(day)
{}

所以對于可讀性不是很好的代碼,可以使用explicit修飾構造函數(shù),將會禁止構造函數(shù)的隱式轉換

以上就是C++ 之explicit關鍵字的詳細內(nèi)容,更多關于explicit關鍵字的資料請關注腳本之家其它相關文章!

相關文章

  • C++ 處理中文符號實例詳解

    C++ 處理中文符號實例詳解

    這篇文章主要介紹了C++ 處理中文符號實例詳解的相關資料,需要的朋友可以參考下
    2017-01-01
  • Windows消息傳遞機制詳解

    Windows消息傳遞機制詳解

    這篇文章主要介紹了Windows消息傳遞機制,有助于讀者更好的理解windows編程的消息機制,需要的朋友可以參考下
    2014-07-07
  • C++內(nèi)存序memory_order的具體操作

    C++內(nèi)存序memory_order的具體操作

    C++原子操作提供6種內(nèi)存序,用于控制多線程內(nèi)存重排序,確保并發(fā)正確性,下面就來具體介紹一下,感興趣的可以了解一下
    2025-07-07
  • VC++6.0實現(xiàn)直線掃描轉換的圖文教程

    VC++6.0實現(xiàn)直線掃描轉換的圖文教程

    這篇文章主要給大家介紹了關于VC++6.0實現(xiàn)直線掃描轉換的相關資料,文中通過圖文將實現(xiàn)的步驟一步步介紹的非常詳細,對大家學習或者使用VC++6.0具有一定的參考學習價值,需要的朋友可以參考下
    2023-01-01
  • QT使用共享內(nèi)存實現(xiàn)進程間通訊

    QT使用共享內(nèi)存實現(xiàn)進程間通訊

    這篇文章主要為大家詳細介紹了QT如何使用共享內(nèi)存實現(xiàn)進程間通訊,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • C語言在linux下編程詳解

    C語言在linux下編程詳解

    這篇文章主要介紹了linux下基于C語言的編程,實例分析了基本使用技巧與相關概念,具有一定參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • C語言數(shù)據(jù)結構中串的模式匹配

    C語言數(shù)據(jù)結構中串的模式匹配

    這篇文章主要介紹了C語言數(shù)據(jù)結構中串的模式匹配的相關資料,需要的朋友可以參考下
    2017-05-05
  • 深入淺析C++ traits技術

    深入淺析C++ traits技術

    traits就是提取“被傳進的對象”對應的返回類型,讓同一個接口實現(xiàn)對應的功能。因為STL的算法和容器是分離的,兩者通過迭代器鏈接,本文通過實例代碼給大家介紹C++ traits技術,感興趣的朋友一起看看吧
    2021-05-05
  • 最新評論

    米泉市| 达日县| 马鞍山市| 淳安县| 东宁县| 通江县| 紫阳县| 肇庆市| 永丰县| 海口市| 准格尔旗| 凯里市| 且末县| 疏附县| 颍上县| 寻乌县| 高邮市| 宁强县| 景东| 滕州市| 乡宁县| 鹤岗市| 高平市| 常山县| 麦盖提县| 察雅县| 新建县| 枣强县| 深州市| 景谷| 宁乡县| 布拖县| 孝义市| 长葛市| 广水市| 安庆市| 田东县| 水富县| 射阳县| 郧西县| 正宁县|