C++類型轉(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)文章
C++兩個(gè)cpp文件間如何進(jìn)行各自函數(shù)的調(diào)用方式
這篇文章主要介紹了C++兩個(gè)cpp文件間如何進(jìn)行各自函數(shù)的調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
C語言實(shí)現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
C語言實(shí)現(xiàn)3*3數(shù)組對(duì)角線之和示例
今天小編就為大家分享一篇C語言實(shí)現(xiàn)3*3數(shù)組對(duì)角線之和示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
C語言統(tǒng)計(jì)字符個(gè)數(shù)代碼分享
本文給大家分享的是2則C語言實(shí)現(xiàn)統(tǒng)計(jì)字符個(gè)數(shù)的代碼,非常的簡單實(shí)用,小伙伴們根據(jù)自己的項(xiàng)目需求自由選擇吧。2015-07-07
C++的靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編
本文闡述了靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編的概念和區(qū)別,通過具體實(shí)例分析了實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編的條件,指出了虛函數(shù)是實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編的基礎(chǔ)。2016-03-03
c++實(shí)現(xiàn)reactor高并發(fā)服務(wù)器的詳細(xì)教程
這篇文章主要介紹了c++從零實(shí)現(xiàn)reactor高并發(fā)服務(wù)器,包括環(huán)境準(zhǔn)備和基礎(chǔ)知識(shí)介紹,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-03-03
Qt圖形圖像開發(fā)之高性能曲線圖模塊QCustomplot庫詳細(xì)使用方法與實(shí)例(支持動(dòng)、靜曲線圖)
這篇文章主要介紹了Qt圖形圖像開發(fā)之高性能曲線圖模塊QCustomplot庫詳細(xì)使用方法與實(shí)例(支持動(dòng)、靜曲線圖),需要的朋友可以參考下2020-03-03

