在CRect中定义了两个转换运算符,即
operator LPCRECT( ) const throw( );
operator LPRECT( ) const throw( );
由于有了这两个转换运算符,所以在需要一个RECT指针的地方,我们可以传递一个CRect的对象。例如:大家知道函数
BOOL GetWindowRect(          HWND hWnd,
    LPRECT lpRect
);CRect rect;
GetWindowRect(rect);//在这里传递一个CRect的对象rect,由于转换运算符的存在,ok????????????????????????????????????????????????
我的问题是:
现有函数
virtual BOOL Create(
   LPCTSTR lpszClassName,
   LPCTSTR lpszWindowName,
   DWORD dwStyle = WS_OVERLAPPEDWINDOW,
   const RECT& rect = rectDefault,
   CWnd* pParentWnd = NULL,
   LPCTSTR lpszMenuName = NULL,
   DWORD dwExStyle = 0,
   CCreateContext* pContext = NULL 
);
该函数的第四个参数需要传递一个RECT的引用,也就是要传递一个RECT对象,但是为什么在此传递一个CRect对象也能够编译通过呢?

CRect rc(100,100,450,450);
Create(NULL,_T("hello"),WS_OVERLAPPEDWINDOW,rc);
请各位大虾帮忙分析一下。

解决方案 »

  1.   

    It can be either a CRect object or a RECT structure
      

  2.   

    A CRect object can be passed as a function parameter wherever a RECT structure, LPCRECT, or LPRECT can be passed.
      

  3.   

    RECT是windows的结构体它是typedef struct tagRECT,而CRect是继承于tagRECT.所以它们是来自两个基类,只不过CRect本身增加一些成员函数而已,但是数据项是一致的。
      

  4.   

    就是两个方面的原因,引用的具体实现方式(参考汇编代码)和CRect的结构(内存布局)
      

  5.   

    因为CRect类重载了LPCRECT和LPRECT操作符
      

  6.   

    俺没注意到CRect是RECT的子类。谢谢大家了