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

C++類型轉(zhuǎn)換詳解

 更新時(shí)間:2021年10月04日 13:41:58   作者:Booksort  
類型轉(zhuǎn)換有c風(fēng)格的,當(dāng)然還有c++風(fēng)格的。c風(fēng)格的轉(zhuǎn)換的格式很簡單(TYPE)EXPRESSION,但是c風(fēng)格的類型轉(zhuǎn)換有不少的缺點(diǎn),有的時(shí)候用c風(fēng)格的轉(zhuǎn)換是不合適的,因?yàn)樗梢栽谌我忸愋椭g轉(zhuǎn)換

C++對(duì)于內(nèi)置類型有隱式或顯式的類型轉(zhuǎn)化,如int,double,long,char,但是,C++還有類這個(gè)概念,類是一種自定義類型,為了讓類(自定義類型)達(dá)到內(nèi)置類型的層次,C++對(duì)類也挺提供一些方法進(jìn)行自動(dòng)或者強(qiáng)制類型轉(zhuǎn)換
C++的好多工作,在我看來就是讓自定義類型能和內(nèi)置類型一樣簡單使用、操作。

內(nèi)置類型的轉(zhuǎn)換

    int a = 8;
	double b = 4.4;
	long c = a;//隱式類型轉(zhuǎn)換
	long d = (long)b;//顯式類型轉(zhuǎn)換

這都是我們熟悉的,是編譯器已經(jīng)幫我們處理好了的。

自定義類型轉(zhuǎn)換

對(duì)于自定義類型,其類型轉(zhuǎn)換,都是我們可以自己實(shí)現(xiàn),自己控制的。

/*
* 對(duì)石塊類的 聲明定義
*/
class Stone
{
public:
	Stone(double weight);
	Stone(int stone_type, double volume);
private:
	int _stone_type;
	double _weight;
	double _volume;
};
Stone::Stone(double weight)
{
	_stone_type = 1;
	_weight = weight;
	_volume = 10.5;
}
Stone::Stone(int stone_type, double volume=10.5)
{
	_stone_type = stone_type;
	_weight = 5.8;
	_volume = volume;
}

我們提供了Stone(double) 這個(gè)構(gòu)造函數(shù)的重載,可以直接將double類型進(jìn)行構(gòu)造出一個(gè)類。

	Stone s1 = 24.5;
	Stone s2(10.5);
	Stone s3(21, 20.5);

對(duì)于Stone s1 = 24.5;而言,重新是由構(gòu)造函數(shù)Stone(double)來創(chuàng)建一個(gè)臨時(shí)的Stone對(duì)象,并將24.5作為初始值,隨后,采用逐成員復(fù)值的方法,將該臨時(shí)對(duì)象的內(nèi)容復(fù)制到s1對(duì)象中。也就是將一個(gè)double類型的對(duì)象轉(zhuǎn)換為Stone類型的對(duì)象。

這一過程稱為隱式轉(zhuǎn)換,它是自動(dòng)進(jìn)行的,不需要顯式遷至類型轉(zhuǎn)換。

注意:只有接受一個(gè)參數(shù)的構(gòu)造函數(shù)才能作為轉(zhuǎn)換函數(shù),

像Stone(int stone_type, double volume)有兩個(gè)參數(shù),因此不能用來轉(zhuǎn)換類型,然而,如果它第二代參數(shù)是個(gè)缺省,提供了默認(rèn)值,其便可以用來進(jìn)行int對(duì)象的轉(zhuǎn)換。
這個(gè)轉(zhuǎn)換函數(shù)是將那些其他(內(nèi)置或者其他的類型)類型向類類型轉(zhuǎn)換

explicit 關(guān)鍵字

將構(gòu)造函數(shù)用作于自動(dòng)類型轉(zhuǎn)換函數(shù)似乎是一項(xiàng)不錯(cuò)的特性,但是這種自動(dòng)轉(zhuǎn)換的并不是在所有情況下都需要,某些情況下,不需要這種轉(zhuǎn)換,但是卻意外的進(jìn)行了轉(zhuǎn)換。

所以C++提供了關(guān)鍵字explicit,用于關(guān)閉這種自動(dòng)轉(zhuǎn)換。

explicit的意思是:顯式的,明確的。

可以加在函數(shù)聲明前

explicit Stone(double weight) 

這樣,只能顯式調(diào)用這個(gè)構(gòu)造。

在這里插入圖片描述

Stone s1 = Stone(24.5);
Stone s4 = (Stone)19.99;//非常像內(nèi)置類型的顯式轉(zhuǎn)換

這樣顯式調(diào)用就沒什么問題。

提醒

還有一個(gè)要提醒的:如果像這個(gè)一樣,

在這里插入圖片描述

有兩個(gè)參數(shù)的函數(shù),

在這里插入圖片描述

有一個(gè)加了explicit,另一個(gè)沒加,如果還像剛才一樣,隱式轉(zhuǎn)換的那種,還是能泡過的,因?yàn)?,?huì)執(zhí)行兩個(gè)參數(shù)的構(gòu)造函數(shù),因?yàn)榫瓦@個(gè)是能匹配的,這肯會(huì)造成一個(gè)隱患,給大家提個(gè)醒,要加explicit,構(gòu)成重載的函數(shù)最好都加上,不然出來Bug就不好找了。

提問:編譯器在什么時(shí)候使用Stone(double)?

如果在聲明中使用了關(guān)鍵字explicit,則Stone(double)將只能用于顯式強(qiáng)制類型轉(zhuǎn)換,
如果沒有的話,就還能用于隱式類型轉(zhuǎn)換

  • 將Stone對(duì)象初始化為double值時(shí),例:Stone s1 = 24.5;
  • double值賦給Stone對(duì)象,例:Stone s5;s5 = 19.7;
  • 將double值傳遞給接受Stone參數(shù)的函數(shù),例:
void Print(const Stone& tmp) 
{cout << "Print" << endl;}
Print(19.7);
  • 返回值被聲明為Stone類型的函數(shù)試圖返回double。
  • 在上述任意一種情況下,使用可轉(zhuǎn)換為double類型的內(nèi)置類型時(shí)(只要能轉(zhuǎn)換成double類型的內(nèi)置類型對(duì)象,都能這樣隱式調(diào)用)
    Stone s5;
	s5 = 19;
	Stone s6(100);

同時(shí),要記住編譯器不能處理具有二義性的調(diào)用。

轉(zhuǎn)換函數(shù)

概念介紹

上面也介紹過轉(zhuǎn)換函數(shù),

不過那是內(nèi)置類型轉(zhuǎn)換為類類型,
這里的是類類型轉(zhuǎn)換為內(nèi)置類型。

轉(zhuǎn)換函數(shù)的形式:operator typeName();

1.轉(zhuǎn)換函數(shù)必須是類方法

2.轉(zhuǎn)換函數(shù)不能指定返回類型

3.轉(zhuǎn)換函數(shù)不能有參數(shù)

例如:轉(zhuǎn)換為double類型的函數(shù)原型:

operator double();

typeName(這里指 double ,因此就不需要指定返回類型。轉(zhuǎn)換函數(shù)是類方法意味著:它需要類對(duì)象來調(diào)用,從而告知函數(shù)要轉(zhuǎn)換的值。因此,函數(shù)不需要函數(shù)。

Stone::operator double() const
{
	return _weight;
}

Stone s4 = (Stone)19.99;
double d1 = s4;//隱式調(diào)用
double d2 = (double)s4;//顯式
double d3 = double(s4);//顯式

且這調(diào)用的都是轉(zhuǎn)換函數(shù)。

自動(dòng)引用類型轉(zhuǎn)換

double d1 = s4;//隱式調(diào)用

都是自動(dòng)轉(zhuǎn)換。

還有賦值的情況,可能會(huì)存在內(nèi)置類型之間的轉(zhuǎn)換。

long l1 = s4;

這里可沒有l(wèi)ong的轉(zhuǎn)換函數(shù),說明是轉(zhuǎn)化為double后,又轉(zhuǎn)換為了long類型。

缺陷

轉(zhuǎn)換函數(shù)都存在缺陷。

提供自動(dòng)調(diào)用、隱式轉(zhuǎn)換的函數(shù)存在的問題:使用者不希望轉(zhuǎn)換時(shí),轉(zhuǎn)換函數(shù)也可能進(jìn)行了轉(zhuǎn)換。

所以最好還是要加上explicit,只有顯式調(diào)用時(shí),才能進(jìn)行轉(zhuǎn)換。

或者,使用一些功能相同的類方法來繼續(xù)代替,這樣,如果類成員又類型一樣的也能轉(zhuǎn)換。

double Stone::Stone_to_double_weight(void)
{
	return _weight;
}
double Stone::Stone_to_double_volume(void)
{
	return _volume;
}

我覺得這玩意比那個(gè)還好用一些。

總結(jié)

應(yīng)謹(jǐn)慎使用隱式轉(zhuǎn)換函數(shù)。通常,最好選擇僅在被顯式調(diào)用時(shí)才會(huì)執(zhí)行的函數(shù)

C++為類提供了下面的類型轉(zhuǎn)換

  • 只有一個(gè)參數(shù)的類構(gòu)造函數(shù)用于將類型與該參數(shù)相同的值轉(zhuǎn)換為類類型。
  • 被稱為轉(zhuǎn)換函數(shù)的特殊類成員運(yùn)算符函數(shù),用于將類對(duì)象轉(zhuǎn)換為其他類型,轉(zhuǎn)換函數(shù)是類成員,沒有返回類型,沒有參數(shù),名為operator typeName();

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評(píng)論

清镇市| 寻乌县| 南平市| 嘉鱼县| 阿克陶县| 富锦市| 江都市| 苏尼特左旗| 湘乡市| 邹平县| 社旗县| 胶南市| 闸北区| 岳西县| 霍山县| 伊金霍洛旗| 芦山县| 钟山县| 武汉市| 穆棱市| 丰镇市| 东源县| 吉林省| 泸水县| 永泰县| 淮滨县| 德庆县| 买车| 天峨县| 临潭县| 南陵县| 怀柔区| 台山市| 台北县| 连江县| 弋阳县| 米易县| 寻甸| 周宁县| 宁河县| 焦作市|