用轉換建構函式可以將乙個指定型別的資料轉換為類的物件。但是不能反過來將乙個類的物件轉換為乙個其他型別的資料(例如將乙個complex類物件轉換成double型別資料)。
c++提供型別轉換函式(type conversion function)來解決這個問題。型別轉換函式的作用是將乙個類的物件轉換成另一型別的資料。如果已宣告了乙個complex類,可以在complex類中這樣定義型別轉換函式:
operator double( )
函式返回double型變數real的值。它的作用是將乙個complex類物件轉換為乙個double型資料,其值是complex類中的資料成員real的值。請注意,函式名是operator double,這點是和運算子過載時的規律一致的(在定義運算子「+」的過載函式時,函式名是operator +)。
型別轉換函式的一般形式為:
operator 型別名( )
在函式名前面不能指定函式型別,函式沒有引數。其返回值的型別是由函式名中指定的型別名來確定的。型別轉換函式只能作為成員函式,因為轉換的主體是本類的物件。不能作為友元函式或普通函式。
從函式形式可以看到,它與運算子過載函式相似,都是用關鍵字operator開頭,只是被過載的是型別名。double型別經過過載後,除了原有的含義外,還獲得新的含義(將乙個complex類物件轉換為double型別資料,並指定了轉換方法)。這樣,編譯系統不僅能識別原有的double型資料,而且還會把complex類物件作為double型資料處理。
那麼程式中的complex類對具有雙重身份,既是complex類物件,又可作為double型別資料。complex類物件只有在需要時才進行轉換,要根據表示式的上下文來決定。轉換建構函式和型別轉換運算子有乙個共同的功能:當需要的時候,編譯系統會自動呼叫這些函式,建立乙個無名的臨時物件(或臨時變數)。
[例10.9] 使用型別轉換函式的簡單例子。
#include using namespace std;
class complex
complex(double r,double i)
operator double( ) //型別轉換函式
private:
double real;
double imag;
};int main( )
//預設建構函式
complex(double r)//轉換建構函式
complex(double r,double i)//實現初始化的建構函式
friend complex operator + (complex c1,complex c2); //過載運算子「+」的友元函式
void display( );
private:
double real;
double imag;
};complex operator + (complex c1,complex c2)//定義運算子「+」過載函式
void complex::display( )
此時complex類的公用部分為:
public:
complex( )
complex(double r) //轉換建構函式
complex(double r,double i)
operator double( )//型別轉換函式
friend complex operator+ (complex c1,complex c2); //過載運算子「+」
void display( );
其餘部分不變。程式在編譯時出錯,原因是出現二義性。
如何將多個物件合併為乙個物件
object.assign 方法用於將所有可列舉屬性的值從乙個或多個源物件複製到目標物件。它將返回目標物件。並且源物件也會被修改。const target const source const returnedtarget object.assign target,source console.lo...
C 將乙個物件轉換為指定型別
適用 普通的物件,並且有預設的無引數建構函式 region 將乙個物件轉換為指定型別 將乙個物件轉換為指定型別 待轉換的物件 目標型別 轉換後的物件 public static object converttoobject object obj,type type else if underlyin...
通過反射,如何將數值型列舉值賦值給列舉型別的屬性
處理可空列舉型別 原理它是值型別,原始寫法是nullable,泛型可以有多個型別引數,但資料庫的乙個欄位只會有乙個型別,所以判斷第乙個型別引數是否是列舉 if prop.propertytype.isvaluetype prop.propertytype.isgenerictype prop.pro...