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

C++ 之explicit關(guān)鍵字

 更新時(shí)間:2023年04月09日 09:05:16   作者:烽起黎明  
今天我們來(lái)談?wù)凜++中的explicit關(guān)鍵字,這篇文章詳細(xì)介紹了C語(yǔ)言的關(guān)鍵字explicit關(guān)鍵字,本文有詳細(xì)的代碼實(shí)例,感興趣的同學(xué)可以借鑒參考

??構(gòu)造函數(shù)不僅可以構(gòu)造與初始化對(duì)象,對(duì)于單個(gè)參數(shù)或者除第一個(gè)參數(shù)無(wú)默認(rèn)值其余均有默認(rèn)值的構(gòu)造函數(shù),還具有類型轉(zhuǎn)換的作用

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

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

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

對(duì)于下面的d1很清楚一定是調(diào)用了有參構(gòu)造進(jìn)行初始化,不過(guò)對(duì)于d2來(lái)說(shuō),也是一種構(gòu)造方式

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

依舊通過(guò)調(diào)試來(lái)看就會(huì)非常清晰,這種寫(xiě)法也會(huì)去調(diào)用構(gòu)造函數(shù)

在這里插入圖片描述

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

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

在這里插入圖片描述

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

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

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

剛才說(shuō)到了中間會(huì)產(chǎn)生一個(gè)臨時(shí)對(duì)象,而且會(huì)調(diào)用構(gòu)造 + 拷貝構(gòu)造,那此時(shí)我們?cè)贒ate類中寫(xiě)一個(gè)拷貝構(gòu)造函數(shù),調(diào)試再去看看會(huì)不會(huì)去進(jìn)行調(diào)用

  • 很明顯沒(méi)有,我在進(jìn)入Date類后一直在按F11,但是卻進(jìn)不到拷貝構(gòu)造中,這是為什么呢?

在這里插入圖片描述

  • 原因其實(shí)在于編譯器在這里地方做了一個(gè)優(yōu)化,將【構(gòu)造 + 拷貝構(gòu)造】?jī)?yōu)化成了【一個(gè)構(gòu)造】,因?yàn)榫幾g器在這里覺(jué)得構(gòu)造再加拷貝構(gòu)造太費(fèi)事了,干脆就合二為一了。其實(shí)對(duì)于這里的優(yōu)化不同編譯器是有區(qū)別的,像一下VC++、DevC++可能就不會(huì)去優(yōu)化,越是新的編譯器越可能去進(jìn)行這種優(yōu)化。在本文的最后一個(gè)模塊我還會(huì)詳細(xì)展開(kāi)分析

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

在這里插入圖片描述

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

對(duì)于上面所講的都是基于單參的構(gòu)造函數(shù),接下去我們來(lái)瞧瞧多參的構(gòu)造函數(shù)

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

在這里插入圖片描述


??小馮:那要怎么辦呀,對(duì)于一定要傳入多參數(shù)進(jìn)行構(gòu)造的場(chǎng)景

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

Date d2 = { 2023, 3 };

在這里插入圖片描述

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

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

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

在這里插入圖片描述

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

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

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

相關(guān)文章

  • FFmpeg實(shí)現(xiàn)將編碼后數(shù)據(jù)保存成mp4

    FFmpeg實(shí)現(xiàn)將編碼后數(shù)據(jù)保存成mp4

    這篇文章主要為大家詳細(xì)介紹了FFmpeg如何實(shí)現(xiàn)將編碼后數(shù)據(jù)保存成mp4,即從內(nèi)存塊中獲取原始數(shù)據(jù),然后依次進(jìn)行解碼、編碼、最后保存成mp4視頻文件,感興趣的可以了解一下
    2023-08-08
  • QT實(shí)現(xiàn)五子棋游戲

    QT實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C語(yǔ)言實(shí)現(xiàn)快速排序

    C語(yǔ)言實(shí)現(xiàn)快速排序

    快速排序不一定是穩(wěn)定排序,這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)快速排序算法,具有一定的參考價(jià)值,感興趣的同學(xué)可以借鑒閱讀
    2023-03-03
  • C++中關(guān)于std::queue?中遇到釋放內(nèi)存錯(cuò)誤的問(wèn)題

    C++中關(guān)于std::queue?中遇到釋放內(nèi)存錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了std::queue中遇到釋放內(nèi)存錯(cuò)誤的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • C語(yǔ)言修煉之路悟徹?cái)?shù)組真妙理?巧用下標(biāo)破萬(wàn)敵上篇

    C語(yǔ)言修煉之路悟徹?cái)?shù)組真妙理?巧用下標(biāo)破萬(wàn)敵上篇

    在C語(yǔ)言和C++等語(yǔ)言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲(chǔ)類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來(lái)指向若干個(gè)字符串,使字符串處理更加方便、靈活
    2022-02-02
  • C++實(shí)現(xiàn)延遲的方法詳解

    C++實(shí)現(xiàn)延遲的方法詳解

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)延遲的三個(gè)方法,文中的示例代碼講解詳細(xì),對(duì)我們深入了解C++有一定的幫助,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-12-12
  • C語(yǔ)言中多維數(shù)組的內(nèi)存分配和釋放(malloc與free)的方法

    C語(yǔ)言中多維數(shù)組的內(nèi)存分配和釋放(malloc與free)的方法

    寫(xiě)代碼的時(shí)候會(huì)碰到多維數(shù)組的內(nèi)存分配和釋放問(wèn)題,在分配和釋放過(guò)程中很容易出現(xiàn)錯(cuò)誤。下面貼上一些示例代碼,以供參考。
    2013-05-05
  • OpenCV實(shí)現(xiàn)拼圖板小游戲

    OpenCV實(shí)現(xiàn)拼圖板小游戲

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)拼圖板小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例

    C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例

    大家好,本篇文章主要講的是C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • 深入淺析C語(yǔ)言中堆棧和隊(duì)列

    深入淺析C語(yǔ)言中堆棧和隊(duì)列

    這篇文章主要介紹了深入淺析C語(yǔ)言中堆棧和隊(duì)列的相關(guān)資料,需要的朋友可以參考下
    2016-06-06

最新評(píng)論