轉換函式分為兩種:
1、自己定義的類通過轉換函式轉換為其他型別
2、其他型別通過轉換函式(類建構函式)轉換為自己定義的類
形式:1、operator typename(){};
條件:①轉換函式必須為類方法
②轉換函式不能指定返回型別
③轉換函式不能有引數;
例子:
#define conv_fun_h
#include
"stdafx.h"
#include
//這裡寫乙個將分數轉化為小數的轉換函式
class
fraction
//可以把這種東西轉化為別的東西
operator
double()
const};
#endif
// !conv_fun_h
#include
"stdafx.h"
#include
#include
"conv_fun.h"
using
namespace std;
intmain()
結果:
2、建構函式轉換
包含顯示轉換和隱士轉換。
顯式轉換可以有多個輸入引數,而隱式轉換只能有乙個
例如:有乙個類mycat中的建構函式為
stonewet(double a,double b=0);//這裡可以只有乙個傳入引數,因為有乙個預設的;
顯式轉換: mycat tom(0.5,34.0);
隱式轉換:mycat tom = 0.5;//這裡編譯器會去類中找是否有個建構函式只傳入乙個double引數,於是找到了,那麼久建立了物件。
問題:有是因為這種隱式轉換可能會帶來二義性的麻煩,為了解決這個問題,引入了乙個關鍵字explicit用於建構函式之前,限定了這種建構函式只能顯式轉換,不能隱士轉換。
#define conv_fun_h
#include
"stdafx.h"
#include
//這裡寫乙個將分數轉化為小數的轉換函式
class
fraction
//可以把這種東西轉化為別的東西
fraction operator
+(cosnt fraction& f)
operator
double()
const};
#endif
// !conv_fun_h
fraction f(3
,5);
fraction d2 = f+4;
//這裡就會出問題,即ambiguous,因為f後面的+在類中進行了過載,而4就會傳入過載函式中
//而過載函式傳入的引數為fraction型別,所以編譯器就會想用建構函式轉換為fraction型別,但是左邊的d2是
//宣告了fraction,直接用的fraction,所以編譯器此時不知道該怎麼轉換,所以要引入explict
explicit
fraction
(int num,
int den =1)
:m_numerator
(num)
,m_denominator
(den)
//加了explicit(明白的)就告訴編譯器不會**轉換
小結:使用explicit限定了這種建構函式(只接受乙個引數),則它只能用於顯示轉換,否則有也可以用於隱士轉換。 C 轉換函式
在c 中,可以利用建構函式將乙個int型變數轉換為乙個類物件,如cmyclass aclass 5 有人便會問,可以進行相反的轉換嗎?例如將乙個類物件轉換為乙個int值,int ntemp aclass c 可以實現這一需求.但不是建構函式.建構函式只能用於某種型別到類型別的轉換.要進行相反的轉換,...
c 轉換函式
1.轉換函式三要素1.轉換函式必須是類方法 2.轉換函式不能指定返回型別 3.轉換函式不能有引數 2.函式demon include using namespace std class stonewt int stone double pds left double pounds public st...
C 轉換建構函式和轉換函式
1 轉換建構函式的作用 作用 將某種型別轉換為類型別 例如有下面的 base int a 轉換建構函式 base b 物件 b 12 解析 程式將使用建構函式base int a 構造出乙個臨時的無名base物件,並用12對其初始化。然後採用逐個成員賦值的方式將該臨時物件的內容賦值給物件b。這一過程...