C 型別轉換詳解

2022-09-24 08:09:13 字數 2746 閱讀 9246

目錄

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