溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中類的轉(zhuǎn)換函數(shù)怎么用

發(fā)布時間:2022-03-14 09:05:10 來源:億速云 閱讀:160 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下C++中類的轉(zhuǎn)換函數(shù)怎么用的相關(guān)知識點,內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

只有接受一個參數(shù)(其他參數(shù)有默認(rèn)值的也算)的構(gòu)造函數(shù)才能作為轉(zhuǎn)換構(gòu)造函數(shù)。

在C++中,接受一個參數(shù)的構(gòu)造函數(shù)為將類型與該參數(shù)相同的值轉(zhuǎn)換為類提供了藍(lán)圖。因此,下面的構(gòu)造函數(shù)用于將double類型的值轉(zhuǎn)換為Stonewt類型:

Stonewt(double lbs) // double轉(zhuǎn)Stonewt的模板

也就是說,可以編寫這樣的代碼:

Stonewt myCat; // 創(chuàng)建一個Stonewt對象
myCat = 19.6; // 使用Stonewt(double)將19.6轉(zhuǎn)換為Stonewt對象

這一過程稱為隱式轉(zhuǎn)換,因為它是自動進(jìn)行的,而不需要顯式強(qiáng)制類型轉(zhuǎn)換。

將構(gòu)造函數(shù)用作自動類型轉(zhuǎn)換似乎是一項不錯的特性。然而,當(dāng)程序員擁有更豐富的C++經(jīng)驗時,將發(fā)現(xiàn)這種自動特性并非總是合乎需要的,因為這會導(dǎo)致意外的類型轉(zhuǎn)換。因此,C++新增了關(guān)鍵字explicit,用于關(guān)閉這種自動特性。也就是說,可以這樣聲明構(gòu)造函數(shù):

explicit Stonewt(double lbs) // 不允許隱式轉(zhuǎn)換

這將關(guān)閉上述示例中介紹的隱式轉(zhuǎn)換,但仍然允許顯式轉(zhuǎn)換,即顯式強(qiáng)制類型轉(zhuǎn)換:

Stonewt myCat;
myCat = 19.6; // 不允許,因為Stonewt(double)聲明為explicit
myCat = Stonewt(19.6); // OK,一個顯示地轉(zhuǎn)換
myCat = (Stonewt)19.6; // OK,原始地顯示類型轉(zhuǎn)換

編譯器在什么時候?qū)⑹褂肧tonewt(double)函數(shù)呢?

如果在聲明中使用了關(guān)鍵字explicit,則Stonewt(double)將只用于顯式強(qiáng)制類型轉(zhuǎn)換,否則還可以用于下面的隱式轉(zhuǎn)換:

  • 將Stonewt對象初始化為double值時。如:Stonewt st(1.23);

  • 將double值賦給Stonewt對象時。如:Stonewt st; st = 1.23;

  • 將double值傳遞給接受Stonewt參數(shù)的函數(shù)時。如:display(Stonewt& st);-> display(1.23);

  • 返回值被聲明為Stonewt的函數(shù)試圖返回double值時。如:Stonewt& go(){ return 1.23; }

  • 在上述任意一種情況下,使用可轉(zhuǎn)換為double類型的內(nèi)置類型時。如:Stonewt& go() { return 123; }

可以將數(shù)字轉(zhuǎn)換為Stonewt對象??梢宰鱿喾吹霓D(zhuǎn)換嗎?也就是說,是否可以將Stonewt對象轉(zhuǎn)換為double值,就像如下所示的那樣?

Stonewt wolfe(285.7);
double host = wolfe;// ??可以嗎??

可以這樣做,但不是使用構(gòu)造函數(shù)。構(gòu)造函數(shù)只用于從某種類型到類類型的轉(zhuǎn)換。要進(jìn)行相反的轉(zhuǎn)換,必須使用特殊的C++運算符函數(shù)——轉(zhuǎn)換函數(shù)。

轉(zhuǎn)換函數(shù)是用戶定義的強(qiáng)制類型轉(zhuǎn)換,可以像使用強(qiáng)制類型轉(zhuǎn)換那樣使用它們。例如,如果定義了從Stonewt到double的轉(zhuǎn)換函數(shù),就可以使用下面的轉(zhuǎn)換:

Stonewt wolfe(285.7);
double host = double (wolfe);    // syntax #1
double thinker = (double) wolfe; // syntax #2
也可以讓編譯器來決定如何做:
Stonewt wells(20, 3);
double star = wells; // 隱式使用轉(zhuǎn)換函數(shù)

編譯器發(fā)現(xiàn),右側(cè)是Stonewt類型,而左側(cè)是double類型,因此它將查看程序員是否定義了與此匹配的轉(zhuǎn)換函數(shù)。(如果沒有找到這樣的定義,編譯器將生成錯誤消息,指出無法將Stonewt賦給double。)

創(chuàng)建一個轉(zhuǎn)換函數(shù),轉(zhuǎn)換為typeName類型,需要使用這種形式的轉(zhuǎn)換函數(shù):

operator typeName();// 無返回類型,無參數(shù)

請注意以下幾點:

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

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

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

在類的頭文件定義:

operator int() const;
operator double() const;

實現(xiàn)代碼:

......
// construct Stonewt object from stone, double values
Stonewt::Stonewt(int stn, double lbs) {
	stone = stn;
	pds_left = lbs;
	pounds = stn * Lbs_per_stn + lbs;
}
......
// conversion functions
Stonewt::operator int() const {
	return int(pounds + 0.5);
}
Stonewt::operator double() const {
	return pounds;
}

使用:

Stonewt poppins(9, 2.8);// 9 stone, 2.8 pounds
double p_wt = poppins;// implicit conversion
cout << "Convert to double => ";
cout << "Poppins: " << p_wt << " pounds.\n";
cout << "Convert to int => ";
cout << "Poppins: " << int(poppins) << " pounds.\n";
Convert to double => Poppins: 128.8 pounds.
Convert to int => Poppins: 129 pounds.

原則上說,最好使用顯式轉(zhuǎn)換,而避免隱式轉(zhuǎn)換。在C++98中,關(guān)鍵字explicit不能用于轉(zhuǎn)換函數(shù),但C++11消除了這種限制。因此,在C++11中,可將轉(zhuǎn)換運算符聲明為顯式的:

class Stonewt {
    ...
    // 轉(zhuǎn)換函數(shù)
    explicit operator int() const;
    explicit operator double() const;
};

有了explicit聲明后,在顯式強(qiáng)制轉(zhuǎn)換時才調(diào)用這些運算符。

另一種方法是,用一個功能相同的非轉(zhuǎn)換函數(shù)替換該轉(zhuǎn)換函數(shù)即可,但僅在被顯式地調(diào)用時,該函數(shù)才會執(zhí)行。也就是說,可以將:

Stonewt::operator int() { return int (pounds + 0.5); }
替換為:
int Stonewt::Stone_to_Int() { return int (pounds + 0.5); }

這樣,下面的語句:

int plb = poppins; // 非法
int plb1 = (int) poppins;// 合法
int plb2 = int(poppins);// 合法
int plb3 = poppins.Stone_to_Int(); // 合法

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

以上就是“C++中類的轉(zhuǎn)換函數(shù)怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI