目錄
c++對於內建型別有隱式或顯式的型別轉化,如int,double,long,char,但是,c++還有類這個概念,類是一種自定義型別,為了讓類(自定義型別)達到內建型別的層次,c++對類也挺提供一些方法進行自動或者強制型別轉換
c++的好多任務作,在我看來就是讓自定義型別能和內建型別一樣簡單使用、操作。
int a = 8;
double b = 4.4;
long c = a;//隱式型別轉換
long d = (long)b;//顯式型別轉換
這都是我們熟悉的,是編譯器已經幫我們處理好了的。
對於自定義型別,其型別轉換,都是我們可以自己實現,自己控制的。
/** 對石塊類的 宣告定義
*/class stone
;stone::stone(double weight)
stone::stone(int stone_type, double volume=10.5)
我們提供了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)將只能用於顯式強制型別轉換,
如果沒有的話,就還能用於隱式型別轉換
void print(const stone& tmp)
print(19.7);
stone s5;
s5 = 19;
stone s6(100);
同時,要記住編譯器不能處理具有二義性的呼叫。
上面也介紹過轉換函式,
不過那是內建型別轉換為類型別,
這裡的是類型別轉換為內建型別。
轉換函式的形式:operator typename();
1.轉換函式必須是類方法
2.轉換函式不能指定返回型別
3.轉換函式不能有引數
例如:轉換為double型別的函式原型:
operator double();
typename(這裡指 double ,因此就不需要指定返回型別。轉換函式是類方法意味著:它需要類物件來呼叫,從而告知函式要轉換的值。因此,函式不需要函式。
stone::operator double() const
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)
double stone::stone_to_double_volume(void)
我覺得這玩意比那個還好用一些。
應謹慎使用隱式轉換函式。通常,最好選擇僅在被顯式呼叫時才會執行的函式
c++為類提供了下面的型別轉換
本文標題: c++型別轉換詳解
本文位址: /ruanjian/c/428002.html
c 型別轉換詳解
c 型別轉換分為隱式型別轉換和顯式型別轉換 又稱為 標準轉換 包括以下幾種情況 1,算術轉換 arithmetic conversion 在混合型別的算術表示式中,最寬的資料型別成為目標轉換型別。int ival 3 double dval 3.14159 ival dval ival被提公升為do...
C 型別轉換詳解 const cast
一.函式描述 const cast type id expression 主要是用來去掉const屬性,當然也可以加上const屬性。主要是用前者,後者很少用。去掉const屬性 const case num 常用,因為不能把乙個const變數直接賦給乙個非const變數,必須要轉換。加上const...
C 型別轉換詳解 const cast
一.函式描述 const cast type id expression 主要是用來去掉const屬性,當然也可以加上const屬性。主要是用前者,後者很少用。去掉const屬性 const case num 常用,因為不能把乙個const變數直接賦給乙個非const變數,必須要轉換。加上const...