C++ 轉換構造函數和轉換函數

一、轉換構造函數

(1)轉換構造函數的作用

作用:將某種類型轉換爲類類型
例如有下面的代碼:

Base(int a);      //轉換構造函數
Base b;         //對象
b=12;           

解析:
程序將使用構造函數Base(int a)構造出一個臨時的無名Base對象,並用12對其初始化。然後採用逐個成員賦值的方式將該臨時對象的內容賦值給對象b。這一過程被稱爲隱式類型轉換,因爲它是自動的,不需要顯式強制類型轉換。

(2)轉換構造函數基本形式

定義:只接受一個一個參數的構造函數才能作爲轉換構造函數。
對於這句話有兩層含義:

  1. 構造函數在聲明時,就只設置了一個參數。例如:Base(int a);
  2. 構造函數在聲明時,設置了多個參數,但是其餘參數都是有默認值的。例如: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已經指出要轉換的類型,所以不需要參數。因爲它是類的成員函數,所以是通過類對象來調用,從而告知要轉換的值,因此不需要參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章