今天我對這段**產生了質疑:
operator double ()
我感覺應該是這樣:
double operator double ()
於是我就在csdn上發了乙個貼問了問,經過zhangweiit,mstlq,djjlove_2008,taodm(非常感謝他們)的指點後明白了這是c++的語法規則,我居然不知道。於是我翻開了久違了的《c++ primer》第四版p454,進行了整理(摘抄),希望掌握這個知識點,也希望看到這篇文章的人也掌握這個知識點。
轉換操作符
轉換操作符(conversion operator)是一種特殊的類成員函式。它定義將類型別值轉變為其他型別值的轉換。轉換操作符在類定義體內宣告,在保留字operator之後跟著轉換的目標型別:
class smallint
}operator int() const
private:
std::size_t val;
};轉換函式採用如下通用形式:
operator type();
這裡,type表示內建型別名、類型別名或有型別別名所定義的名字。對任何可作為函式的返回型別(除了void之外)。一般而言,不允許轉換為陣列或函式型別,轉換為指標型別(資料和函式指標)以及引用型別是可以的。
註解: 轉換函式必須是成員函式,不能指定返回型別,並且形參表必須為空。
下述所有的宣告都是錯誤的:
operator int(small int& ); // error:nonmember
class smallint
;雖然轉換函式不能指定返回型別,但是每個轉換函式必須顯示返回乙個指定的值。例如,operator int返回乙個int值;如果定義operator sales_item,它將返回乙個sales_item物件,諸如此類。
最佳實踐: 轉換函式一般不應該改變被轉換的物件。因此,轉換操作符通常應定義為const成員。
1、使用類型別轉換
只要存在轉換,編譯器將在可以使用內建轉換的地方自動呼叫它
在表示式中:
smallint si;
double dval;
si >= dval // si converted to int and then convert to bool
在條件中:
if(si) // si convert to int and then convert to bool
將實參傳給函式或 從函式返回值:
int calc(int);
smallint si;
int i = calc(si); // convert si to int and call calc
作為過載操作符的運算元:
// convert si to int then call << on the int value
cout << si << endl;
在顯示型別轉換中:
int ival;
smallint si = 3.54;
// instruct compiler to cast si to int
ival = static_cast(si) + 3;
2、類型別轉換和標準轉換
使用轉換函式時,被轉換的型別不必與所在需要的型別完全匹配。必要時可在類型別轉換之後跟上標準轉換以獲得想要的型別。例如,在乙個smallint物件與乙個double值的比較中:
smallint si;
double dval;
si >= dval // si converted to int and then convert to double.
首先將si從smallint物件轉換為int值,然後將該int值轉換為double值。
3、只能應用乙個類型別轉換
註解:類型別轉換之後再跟另乙個類型別轉換。如果需要多個類型別轉換,則**將出錯。
例如,假定有乙個類integral,它可以轉換為smallint但不能轉換為int:
// class to hold unsigned integral values
class integral
operator smallint()const
private:
std::size_t val;
};可以在需要smallint的地方使用integral,但不能再需要int的地方使用integral:
int calc(int);
integral intval;
smallint si(intval); // ok:convert intval to small int and copy to si
int i = calc(si); // ok:convert si to int and call calc
int j = calc(intval);// error:on convertion to int from integral
建立si時使用smallint複製建構函式。首先呼叫integral轉換操作符產生乙個smallint型別的臨時值,將int_val物件轉換為smallint物件。然後(合成的)複製建構函式使用該物件值初始化si。
第乙個calc呼叫也是正確的:將實參si自動轉換為int,然後將int值傳給函式。
第二個calc呼叫時錯誤的:沒有從integral到int的直接轉換。從intergral獲得int需要兩次類型別轉換:首先從intergral到smallint,然後從smallint到int。但是,語言只是允許乙個類型別轉換,所以該呼叫出錯。
4.標準轉換可放在類型別轉換之前
使用建構函式執行隱式轉換的時候,建構函式的形參型別不必與所提供的型別完全匹配。例如,下面的**呼叫smallint類中定義的建構函式smallint(int)將sobj轉換為smallint型別:
void calc(smallint);
short sobj;
// sobj prometed from short to int
// that int converted to smallint through the smallint(int) constructor
calc(sobj);
如果需要,在呼叫建構函式執行類型別轉換之前,可將乙個標準轉換序列應用於實參。為了呼叫函式calc(),應用標準轉換將dobj從double型別轉換為int型別,然後呼叫建構函式smallint(int)將轉換結果轉換為smallint型別。
C 過載型別轉換操作符
在需要做資料型別轉換時,一般顯式的寫法是 cpp view plain copy font size 18px type1 i type2 d i type1 d 顯式的寫型別轉,把d從type2型別轉為type1型別 這種寫法不能做到無縫轉換,也就是直接寫 i d,而不需要顯式的寫 type1 來...
怎樣過載強制型別轉換操作符
private double m data 這是乙個非常簡單的例子,不過它已經足以描述我要說明的問題。假如,我們有如下的乙個函式 print int n 當我們如下來使用mydouble的時候 mydouble dbl 234.33 print dbl 注意此處正隱式呼叫了operator int ...
型別轉換和操作符過載 c
也許你從來沒有考慮過型別轉換和操作符過載的問題,畢竟在很多時候,我們都是系統標準型別,使用內建的一些轉換函式和操作符。但是假設你經常性地需要建立自定義型別 或者結構體 同時你想為它們都實現更加豐富的效果,那麼了解.net所支援的型別轉換和操作符過載就顯得有些必要了 下面看看乙個結構體的定義 publ...