欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中類(lèi)的轉(zhuǎn)換函數(shù)你了解嗎

 更新時(shí)間:2022年03月13日 14:39:43   作者:itzyjr  
這篇文章主要為大家詳細(xì)介紹了C++中類(lèi)的轉(zhuǎn)換函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

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

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

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

也就是說(shuō),可以編寫(xiě)這樣的代碼:

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

這一過(guò)程稱(chēng)為隱式轉(zhuǎn)換,因?yàn)樗亲詣?dòng)進(jìn)行的,而不需要顯式強(qiáng)制類(lèi)型轉(zhuǎn)換。

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

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

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

Stonewt myCat;
myCat = 19.6; // 不允許,因?yàn)镾tonewt(double)聲明為explicit
myCat = Stonewt(19.6); // OK,一個(gè)顯示地轉(zhuǎn)換
myCat = (Stonewt)19.6; // OK,原始地顯示類(lèi)型轉(zhuǎn)換

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

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

  • 將Stonewt對(duì)象初始化為double值時(shí)。如:Stonewt st(1.23);
  • 將double值賦給Stonewt對(duì)象時(shí)。如:Stonewt st; st = 1.23;
  • 將double值傳遞給接受Stonewt參數(shù)的函數(shù)時(shí)。如:display(Stonewt& st);-> display(1.23);
  • 返回值被聲明為Stonewt的函數(shù)試圖返回double值時(shí)。如:Stonewt& go(){ return 1.23; }
  • 在上述任意一種情況下,使用可轉(zhuǎn)換為double類(lèi)型的內(nèi)置類(lèi)型時(shí)。如:Stonewt& go() { return 123; }

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

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

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

轉(zhuǎn)換函數(shù)是用戶(hù)定義的強(qiáng)制類(lèi)型轉(zhuǎn)換,可以像使用強(qiáng)制類(lèi)型轉(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
也可以讓編譯器來(lái)決定如何做:
Stonewt wells(20, 3);
double star = wells; // 隱式使用轉(zhuǎn)換函數(shù)

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

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

operator typeName();// 無(wú)返回類(lèi)型,無(wú)參數(shù)

請(qǐng)注意以下幾點(diǎn):

  • 轉(zhuǎn)換函數(shù)必須是類(lèi)方法
  • 轉(zhuǎn)換函數(shù)不能指定返回類(lèi)型
  • 轉(zhuǎn)換函數(shù)不能有參數(shù)

在類(lèi)的頭文件定義:

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

實(shí)現(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.

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

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

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

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

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

這樣,下面的語(yǔ)句:

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)用時(shí)才會(huì)執(zhí)行的函數(shù)。

總結(jié)

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

 

相關(guān)文章

  • C語(yǔ)言return, exit, abort的區(qū)別

    C語(yǔ)言return, exit, abort的區(qū)別

    這篇文章主要介紹了C語(yǔ)言return, exit, abort的區(qū)別,一般情況下,在C語(yǔ)言中退出一個(gè)程序用return,如果在main函數(shù)中,return在清理局部對(duì)象之后,會(huì)調(diào)用exit函數(shù),和return相比,exit并不會(huì)銷(xiāo)毀局部對(duì)象,下面一起進(jìn)入文章了解更詳細(xì)內(nèi)容吧,需要的朋友也可以參考一下
    2022-01-01
  • Matlab實(shí)現(xiàn)繪制立體玫瑰花的示例代碼

    Matlab實(shí)現(xiàn)繪制立體玫瑰花的示例代碼

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)繪制更立體的玫瑰花,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2023-02-02
  • C語(yǔ)言實(shí)現(xiàn)掃雷附完整代碼

    C語(yǔ)言實(shí)現(xiàn)掃雷附完整代碼

    本文詳細(xì)講解了C語(yǔ)言實(shí)現(xiàn)掃雷并附完整代碼,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • C++中引用(&)的用法與應(yīng)用實(shí)例分析

    C++中引用(&)的用法與應(yīng)用實(shí)例分析

    引用是C++引入的新語(yǔ)言特性,是C++常用的一個(gè)重要內(nèi)容之一,正確、靈活地使用引用,可以使程序簡(jiǎn)潔、高效。故在本篇中我將對(duì)引用進(jìn)行詳細(xì)討論,希望對(duì)大家更好地理解和使用引用起到拋磚引玉的作用
    2013-09-09
  • C語(yǔ)言分支循環(huán)其嵌套語(yǔ)句的使用

    C語(yǔ)言分支循環(huán)其嵌套語(yǔ)句的使用

    本文主要介紹了switch 嵌套和循環(huán)嵌套,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++ LARGE_INTEGER解析與使用案例詳解

    C++ LARGE_INTEGER解析與使用案例詳解

    這篇文章主要介紹了C++ LARGE_INTEGER解析與使用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 詳解C++虛函數(shù)的工作原理

    詳解C++虛函數(shù)的工作原理

    這篇文章主要介紹了C++虛函數(shù)的工作原理的的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • c++中new和delete操作符用法

    c++中new和delete操作符用法

    c++中new和delete運(yùn)算符是用于動(dòng)態(tài)分配和撤銷(xiāo)內(nèi)存的運(yùn)算符,下面是示例,大家參考使用吧
    2014-04-04
  • C++中神奇的tuple詳解使用技巧及實(shí)例解析

    C++中神奇的tuple詳解使用技巧及實(shí)例解析

    C++11標(biāo)準(zhǔn)新引入了一種類(lèi)模板,命名為 tuple(中文可直譯為元組),下面這篇文章主要給大家介紹了關(guān)于C++中神奇的tuple詳解使用技巧及實(shí)例解析的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • vscode配置遠(yuǎn)程開(kāi)發(fā)環(huán)境并遠(yuǎn)程調(diào)試運(yùn)行C++代碼的教程

    vscode配置遠(yuǎn)程開(kāi)發(fā)環(huán)境并遠(yuǎn)程調(diào)試運(yùn)行C++代碼的教程

    這篇文章主要介紹了vscode配置遠(yuǎn)程開(kāi)發(fā)環(huán)境并遠(yuǎn)程調(diào)試運(yùn)行C++代碼的教程,本文通過(guò)截圖實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論