一、轉換構造函數
(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已經指出要轉換的類型,所以不需要參數。因爲它是類的成員函數,所以是通過類對象來調用,從而告知要轉換的值,因此不需要參數。