(1)轉換建構函式的作用
作用:將某種型別轉換為類型別
例如有下面的**:
base
(int a)
;//轉換建構函式
base b;
//物件
b=12
;
解析:
程式將使用建構函式base(int a)
構造出乙個臨時的無名base
物件,並用12
對其初始化。然後採用逐個成員賦值的方式將該臨時物件的內容賦值給物件b
。這一過程被稱為隱式型別轉換,因為它是自動的,不需要顯式強制型別轉換。
(2)轉換建構函式基本形式
定義:只接受乙個乙個引數的建構函式才能作為轉換建構函式。
對於這句話有兩層含義:
建構函式在宣告時,就只設定了乙個引數。例如:base(int a);
建構函式在宣告時,設定了多個引數,但是其餘引數都是有預設值的。例如:base(int a,double b=12.0);
以上兩種形式都可以。
(3)使用explicit關鍵字
在建構函式前面加上explicit關鍵字,那麼將禁止這種隱式型別轉換,但是還是可以進行顯式轉換。例如:
explicit base
(int a)
;
那麼
base b;
//物件
b=12
;
將出錯。
(1)作用:
它的作用正好和轉換建構函式相反。它是將類型別轉換為某種型別。將類物件賦值給typename變數或者將其強制轉換為typename型別時,將自動呼叫轉換函式。
例如下面**:
假設定義了從base型別轉換為double型別的轉換函式。
一、使用者主動呼叫
base object(12
);//類物件
double a=
double
(object)
;double a=
(double
) object;
//這兩種呼叫形式都可以
二、由編譯器決定如何做:
base object(10
);double a=object;
編譯器發現右側是類型別,而左側是double型別,因此他會檢視程式設計師是否定義了與此匹
配的轉換函式,如果沒有,將編譯出錯。
(2)形式
形式如下:
operator typename()
;
其中typename
是要轉換的型別,如果是double
就是operator double();
注意事項:
1. 轉換函式必須是類的成員函式
2. 轉換函式無返回值
3. 轉換函式不能有引數
因為typename已經指出要轉換的型別,所以不需要引數。因為它是類的成員函式,所以是通過類物件來呼叫,從而告知要轉換的值,因此不需要引數。
C 轉換建構函式和隱式轉換函式
其實我們已經在c c 中見到過多次標準型別資料間的轉換方式了,這種形式用於在程式中將一種指定的資料轉換成另一指定的型別,也即是強制轉換,比如 int a int 1.23 其作用是將1.23轉換為整形1。然而對於使用者自定義的類型別,編譯 系統並不知道如何進行轉換,所以需要定義專門的函式來告訴編譯系...
C 轉換建構函式和隱式轉換函式
本文的所有內容均來自 今天是第一次聽到c 還有個轉換建構函式,之前經常見到預設建構函式 拷貝建構函式 析構函式,但是從沒聽說過轉換建構函式,隱式轉換函式也是一樣,c 的確是夠博大精深的,再次嘆服!其實我們已經在c c 中見到過多次標準型別資料間的轉換方式了,這種形式用於在程式中將一種指定的資料轉換成...
型別轉換函式 轉換建構函式
用途 將乙個其它型別的資料轉換成自定義的類型別。注意 這種建構函式只有乙個引數,但要區別於拷貝建構函式 形參是乙個自定義型別的引用 例子 include using namespace std class complex 這個預設的建構函式便可以充當 轉換建構函式 complex double r ...