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
- Sep 22 Fri 2006 23:41
程式設計 : CString 與 CRect
全站熱搜
留言列表
發表留言