前幾天看mfc時碰到了乙個讓我困惑不已的問題:
cdc::rectangle的某乙個原型如下:
bool rectangle(lpcrect lprect);
其中lpcrect是const rect*
但是諸如如下所示的呼叫也能通過編譯:
mydc.rectangle(crect(p1, p2));
其中crect是rect的派生類。
這樣豈不是把乙個物件傳入了需要指標作為引數的函式?
補充:cdc::rectangle沒有需要傳入物件的過載版本。
問題的鏈結在這裡:
直到不久前我才發現的端倪:
atltypes_inline crect::operator lpcrect() const throw()
crect實現了lpcrect()運算子,這是什麼意思呢?原來這個叫做隱式型別轉換操作符,在這裡相當於支援crect向lpcrect的隱式轉換。
這種語法可以產生一些好玩的語法糖:
#include using namespace std;
class a
; ~a() {};
operator a*() throw()
void show() };
int main()
不過濫用隱式型別轉換是有害的,會導致一些不確定的行為(詳見more effective c++條款5——對定製的「型別轉換函式」保持警覺)。
隱式型別轉換 與 隱式型別轉換操作符
1 考慮下面的情況 有個person類,內部有個age欄位。正常情況下,定義和賦值為 person p person 8 p person 9 但是有個傢伙很懶,他想這麼寫 person p 8 p 9 這樣寫也是可以的,因為編譯器知道你的意圖,執行的時候會進行一次隱式型別轉換,中間適配乙個臨時物件...
C 中操作符,顯示和隱式轉換
定義乙個人民幣結構。資料型別轉換的語法對於結構和類是一樣的 public struct rmb if jiao 9 this.yuan yuan this.jiao jiao this.fen fen public override string tostring 元角分 yuan,jiao,fen...
複製建構函式 賦值操作符與隱式類型別轉換
問題 現有類a定義如下 class a 3.test3 int main int argc,char argv 對於test1輸出結果為 constructor 解釋 語句 a obj 2 是物件obj的宣告和初始化,也就是構造物件obj。在這裡表示的是初始化,不是賦值。由於 2 和 obj 型別不...