C 隱式型別轉換操作符

2021-06-19 09:51:52 字數 831 閱讀 6274

前幾天看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 型別不...