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

C++中類的轉換函數你了解嗎

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

只有接受一個參數(其他參數有默認值的也算)的構造函數才能作為轉換構造函數。

在C++中,接受一個參數的構造函數為將類型與該參數相同的值轉換為類提供了藍圖。因此,下面的構造函數用于將double類型的值轉換為Stonewt類型:

Stonewt(double lbs) // double轉Stonewt的模板

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

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

這一過程稱為隱式轉換,因為它是自動進行的,而不需要顯式強制類型轉換。

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

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

這將關閉上述示例中介紹的隱式轉換,但仍然允許顯式轉換,即顯式強制類型轉換:

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

編譯器在什么時候將使用Stonewt(double)函數呢?

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

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

可以將數字轉換為Stonewt對象。可以做相反的轉換嗎?也就是說,是否可以將Stonewt對象轉換為double值,就像如下所示的那樣?

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

可以這樣做,但不是使用構造函數。構造函數只用于從某種類型到類類型的轉換。要進行相反的轉換,必須使用特殊的C++運算符函數——轉換函數。

轉換函數是用戶定義的強制類型轉換,可以像使用強制類型轉換那樣使用它們。例如,如果定義了從Stonewt到double的轉換函數,就可以使用下面的轉換:

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

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

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

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

請注意以下幾點:

  • 轉換函數必須是類方法
  • 轉換函數不能指定返回類型
  • 轉換函數不能有參數

在類的頭文件定義:

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

實現代碼:

......
// 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.

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

class Stonewt {
    ...
    // 轉換函數
    explicit operator int() const;
    explicit operator double() const;
};

有了explicit聲明后,在顯式強制轉換時才調用這些運算符。

另一種方法是,用一個功能相同的非轉換函數替換該轉換函數即可,但僅在被顯式地調用時,該函數才會執(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(); // 合法

應謹慎地使用隱式轉換函數。通常,最好選擇僅在被顯式地調用時才會執(zhí)行的函數。

總結

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

 

相關文章

  • C++錯誤使用迭代器超出引用范圍問題及解決方案

    C++錯誤使用迭代器超出引用范圍問題及解決方案

    這篇文章主要介紹了C++錯誤使用迭代器超出引用范圍分析與解決,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • C++設計模式之策略模式

    C++設計模式之策略模式

    這篇文章主要介紹了C++設計模式之策略模式,本文講解了什么是策略模式、策略模式的使用場合、策略模式的代碼實例等內容,需要的朋友可以參考下
    2014-10-10
  • C/C++?string.h庫中memcpy()和memmove()的使用

    C/C++?string.h庫中memcpy()和memmove()的使用

    memcpy與memmove的目的都是將N個字節(jié)的源內存地址的內容拷貝到目標內存地址中,本文主要介紹了C/C++?string.h庫中memcpy()和memmove()的使用,感興趣的可以了解一下
    2023-12-12
  • C++ vector的用法小結

    C++ vector的用法小結

    這篇文章主要介紹了c++中,vector是一個十分有用的容器,下面對這個容器做一下總結
    2013-12-12
  • C語言實現自動分配地址的示例

    C語言實現自動分配地址的示例

    本文介紹了兩種自動分配地址的方法,包括通過宏定義實現地址分配和將EE地址作為一個結構體,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • C++ 標準庫中的 <algorithm> 頭文件算法操作總結

    C++ 標準庫中的 <algorithm> 頭文件算法操作總結

    C++ 標準庫中的 <algorithm> 頭文件提供了大量有用的算法,主要用于操作容器(如 vector, list, array 等),這些算法通常通過迭代器來操作容器元素,本文給大家介紹C++ 標準庫中的 <algorithm> 頭文件算法總結,感興趣的朋友一起看看吧
    2025-04-04
  • C++實現移動立方體示例講解

    C++實現移動立方體示例講解

    這篇文章主要介紹了C++實現移動立方體,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • C++11新特性std::tuple的使用方法

    C++11新特性std::tuple的使用方法

    這篇文章主要介紹了C++11新特性-std::tuple的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • C/C++實現線性單鏈表的示例代碼

    C/C++實現線性單鏈表的示例代碼

    使用鏈存儲結構的線性存儲結構為線性單鏈表,本文將分別利用C語言和C++實現線性單鏈表,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-05-05
  • C++之eigen安裝與測試方式

    C++之eigen安裝與測試方式

    這篇文章主要介紹了C++之eigen安裝與測試方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

内乡县| 临澧县| 商城县| 长垣县| 兴安县| 梁平县| 乌拉特后旗| 正定县| 富顺县| 枣阳市| 延川县| 左权县| 屏山县| 岢岚县| 永靖县| 万安县| 渝中区| 枞阳县| 济南市| 乐山市| 西宁市| 板桥市| 财经| 恩施市| 钟祥市| 宁津县| 长宁区| 繁峙县| 丹凤县| 乌鲁木齐县| 上虞市| 清河县| 长春市| 竹北市| 会同县| 大连市| 德保县| 柳河县| 麻栗坡县| 昆明市| 潍坊市|