目錄
前言
一? 轉換函數
總結
前言
接著上一章的內容
一? 轉換函數
接著我們上一章節的內容,我們知道我們類里面有一個自動轉換利用=這個運算符,這樣就可以使得對象可以接受這個值
那么有沒有可以使一個普通類型去接收一個對象呢?
答案是有的,這就是轉換函數,也叫C++運算符函數
我們通過代碼來理解這個概念
頭文件#ifndef __COOL_H__ #define __COOL_H__using namespace std; class Stonewt{private:static const int Lbs_per_stn = 14;int stone;double pds_left;double pounds;public:Stonewt(double lbs);Stonewt(int stn, double lbs);Stonewt();void show_lbs()const;void show_stn()const;operator int () const;operator double() const; };#endif
工具函數
#include<iostream> #include"cool.h" using namespace std;Stonewt::Stonewt(double lbs){stone = (int)lbs / Lbs_per_stn;pds_left = (int)lbs % Lbs_per_stn + lbs - (int)lbs;pounds = lbs; }Stonewt::Stonewt(int stn, double lbs){stone = stn;pds_left = lbs;pounds = stn * Lbs_per_stn + lbs; }Stonewt::Stonewt(){stone = pds_left = pounds = 0; }void Stonewt::show_lbs()const{cout << "stone = " << stone << "pds_left = " << pds_left << endl; }void Stonewt::show_stn()const{cout << "pounds = " << pounds << endl; }Stonewt::operator int() const{return (int)(pounds + 0.5); }Stonewt::operator double() const{return pounds; }
main函數
#include<iostream> #include"cool.h" using namespace std;int main(){Stonewt popo(9,2.8);double a = popo;cout << a << endl;return 0; }
首先我們要用一個double類型的a進行賦予對象的時候,這個時候如果你沒有寫轉換函數的時候,這個時候是會報錯的,所以我們還要加上轉換函數
編譯器會識別這里的左值是普通類型,右邊為我們自定義類型,編譯器會去尋找這個轉換函數來進行轉換,從而實現對象到普通類型的轉換
書寫的格式:operator typeName() ;
這里的operator表示操作也就是用到轉換函數的
這個后面就是我們要轉換的類型
請注意以下幾點:
? 轉換函數必須是類方法
? 轉換函數不能指定返回類型
? 轉換函數不能有參數
例如,轉換為doub1e類型的函數的原型如下: operator double();
陷阱
當我們程序里面有兩個強制轉換的類型,這個時候不寫顯示轉換的話就會導致編譯器不知道轉換到哪一種類型,但是當我們只有一個強制轉換類型的函數的時候,就可以這么寫
對于這個陷阱我們有兩解決辦法
1? 在前面加上explicit,表示這個只可以用顯示進行強制轉換,不可以進行隱式的轉換
2? 可以寫成成員函數
總結
學習了我們可以從對象轉換到普通類型的方法:轉換函數
這個轉換函數要注意點就是我們書寫多個的時候要注意會出現二義性錯誤
然后就是我們要巧妙使用explicit這個關鍵詞和運用成員函數解決這個問題
書寫格式是operator? typename( )這個格式
?