您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++如何實現類型轉換,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
C++對于內置類型有隱式或顯式的類型轉化,如int,double,long,char,但是,C++還有類這個概念,類是一種自定義類型,為了讓類(自定義類型)達到內置類型的層次,C++對類也挺提供一些方法進行自動或者強制類型轉換
C++的好多工作,在我看來就是讓自定義類型能和內置類型一樣簡單使用、操作。
int a = 8; double b = 4.4; long c = a;//隱式類型轉換 long d = (long)b;//顯式類型轉換
這都是我們熟悉的,是編譯器已經幫我們處理好了的。
對于自定義類型,其類型轉換,都是我們可以自己實現,自己控制的。
/* * 對石塊類的 聲明定義 */ 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) 這個構造函數的重載,可以直接將double類型進行構造出一個類。
Stone s1 = 24.5; Stone s2(10.5); Stone s3(21, 20.5);
對于Stone s1 = 24.5;而言,重新是由構造函數Stone(double)來創建一個臨時的Stone對象,并將24.5作為初始值,隨后,采用逐成員復值的方法,將該臨時對象的內容復制到s1對象中。也就是將一個double類型的對象轉換為Stone類型的對象。
這一過程稱為隱式轉換,它是自動進行的,不需要顯式遷至類型轉換。
注意:只有接受一個參數的構造函數才能作為轉換函數,
像Stone(int stone_type, double volume)有兩個參數,因此不能用來轉換類型,然而,如果它第二代參數是個缺省,提供了默認值,其便可以用來進行int對象的轉換。
這個轉換函數是將那些其他(內置或者其他的類型)類型向類類型轉換
將構造函數用作于自動類型轉換函數似乎是一項不錯的特性,但是這種自動轉換的并不是在所有情況下都需要,某些情況下,不需要這種轉換,但是卻意外的進行了轉換。
所以C++提供了關鍵字explicit,用于關閉這種自動轉換。
explicit的意思是:顯式的,明確的。
可以加在函數聲明前
explicit Stone(double weight)
這樣,只能顯式調用這個構造。
Stone s1 = Stone(24.5); Stone s4 = (Stone)19.99;//非常像內置類型的顯式轉換
這樣顯式調用就沒什么問題。
還有一個要提醒的:如果像這個一樣,
有兩個參數的函數,
有一個加了explicit,另一個沒加,如果還像剛才一樣,隱式轉換的那種,還是能泡過的,因為,會執行兩個參數的構造函數,因為就這個是能匹配的,這肯會造成一個隱患,給大家提個醒,要加explicit,構成重載的函數最好都加上,不然出來Bug就不好找了。
如果在聲明中使用了關鍵字explicit,則Stone(double)將只能用于顯式強制類型轉換,
如果沒有的話,就還能用于隱式類型轉換
將Stone對象初始化為double值時,例:Stone s1 = 24.5;
double值賦給Stone對象,例:Stone s5;s5 = 19.7;
將double值傳遞給接受Stone參數的函數,例:
void Print(const Stone& tmp) {cout << "Print" << endl;} Print(19.7);
返回值被聲明為Stone類型的函數試圖返回double。
在上述任意一種情況下,使用可轉換為double類型的內置類型時(只要能轉換成double類型的內置類型對象,都能這樣隱式調用)
Stone s5; s5 = 19; Stone s6(100);
同時,要記住編譯器不能處理具有二義性的調用。
上面也介紹過轉換函數,
不過那是內置類型轉換為類類型,
這里的是類類型轉換為內置類型。
轉換函數的形式:operator typeName();
1.轉換函數必須是類方法
2.轉換函數不能指定返回類型
3.轉換函數不能有參數
例如:轉換為double類型的函數原型:
operator double();
typeName
(這里指 double ,因此就不需要指定返回類型。轉換函數是類方法意味著:它需要類對象來調用,從而告知函數要轉換的值。因此,函數不需要函數。
Stone::operator double() const { return _weight; } Stone s4 = (Stone)19.99; double d1 = s4;//隱式調用 double d2 = (double)s4;//顯式 double d3 = double(s4);//顯式
且這調用的都是轉換函數。
像
double d1 = s4;//隱式調用
都是自動轉換。
還有賦值的情況,可能會存在內置類型之間的轉換。
long l1 = s4;
這里可沒有long的轉換函數,說明是轉化為double后,又轉換為了long類型。
轉換函數都存在缺陷。
提供自動調用、隱式轉換的函數存在的問題:使用者不希望轉換時,轉換函數也可能進行了轉換。
所以最好還是要加上explicit
,只有顯式調用時,才能進行轉換。
或者,使用一些功能相同的類方法來繼續代替,這樣,如果類成員又類型一樣的也能轉換。
double Stone::Stone_to_double_weight(void) { return _weight; } double Stone::Stone_to_double_volume(void) { return _volume; }
我覺得這玩意比那個還好用一些。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“C++如何實現類型轉換”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。