1.
為什麼 CString Object可以當成 LPCTSTR 丟入 function 之中?

LPCTSTR 在有 #define UNICODE 的時候,它是 const WCHAR*
沒有 #define UNICODE 的時候,它是 const char*

假設
function test(LPCTSTR sNumber)
{
  return atoi(sNumber);
}
我可以這麼做:

CString csStr;
test(csStr);

為什麼?因為:
CString 的 header file 裡面有這樣的一行敘述:
operator LPCTSTR ( ) const;
這行敘述稱為:轉換函式(conversion function)

轉換函式的一般形式為
operator type();
其中 type 可以是 class 或 typedef 名稱,但是 type 不能是陣列或函式。
範例:

class Token
{
public:
  Token(char*, int);
  operator SmallInt() {return val;}
  operator tName() {return name;}
  operator int() {return val;}
private:
  SmallInt val;
  char *name;
};

當 Token 丟到 function test11(int a)之中,
  Token 會因為 operator int() 而自動轉成 int 型態的 val 帶入
當 Token 丟到 function test12(tName ID)之中,
  Token 會因為 operator tName() 而自動轉成 char* 型態的 name 帶入。

那為什麼 Compile 時不會出錯?
因為 Compile 會先去 header file 內找,當它發現 header 中
有 conversion function 的時候,看它的傳回型態,若符合function 的
參數型態,就當成它是對的了。
這也就是為什麼 CString 可以當成
LPCTSTR 或 char* 帶入一些相關函式的原因了。

2.
為什麼 CRect Object 可以當成 RECT or RECT* 並丟入 function 之中?
假如今天有個 function test2(RECT* rtRectangle){...}
我們卻可以將 CRect 的 Object 丟進 function 當成參數,
而且 Compile時卻不會發生任何錯誤?

因為 conversion function,
CRect 的 Header file 有宣告

operator LPRECT();
operator LPCRECT() const;

所以可以當成 RECT* 傳回(詳見第一題)
另外,
CRect 繼承了 RECT 這個 struct,
所以 CRect 可以當成 RECT 的參數帶入。

這是我整理出來的心得,
希望這個對大家有幫助。

Reference: C++ Primer

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 姚小新 的頭像
    姚小新

    快樂崇拜@Pixnet

    姚小新 發表在 痞客邦 留言(0) 人氣()