CRect 到底是类还是对象 
为啥能直接能用?
不用再定义对象? 比如:CButton::Create 
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );参数const RECT& rect 需要一个CRect对象 或者是rect结构体定义一个CButton对象btn:btn.Create( LPCTSTR lpszCaption, DWORD dwStyle, CRect( int l, int t, int r, int b ), CWnd* pParentWnd, UINT nID ); 为什么可以直接写成这样?而不需要定义一个CRect的对象去调用? 百度以后的解释是: CRect是MFC的一个类,它重载了所有与RECT,LPCRECT,LPRECT相关的一些操作,所以在使用时可以不用考虑目的对象具体是RECT/LPCRECT/LPRECT,因为CRect都会进行自动转换 ! 基础太差!不是很明白!知道可以这么用,但是不知道为什么? 别再建议我去查msdn了,已经找过,没找到答案!

解决方案 »

  1. 你应该找一本好的C++语法书btn.Create( LPCTSTR lpszCaption, DWORD dwStyle,
    CRect( int l, int t, int r, int b ), CWnd* pParentWnd, UINT nID );这里是产生了一个临时的CRect对象。
    RECT是CRect的基类。直接隐式转化了
      

  2. CRect是个类,类里面实现RECT/LPCRECT/LPRECT你把对象传统给相应的函数时,编译器会按照重载函数进行相应的转换。
      

  3. CRect是从RECT继承下来的
    btn.Create( LPCTSTR lpszCaption, DWORD dwStyle, CRect( int l, int t, int r, int b ), CWnd* pParentWnd, UINT nID ); 构造函数返回类对象
      

  4. CRect是MFC的一个类,它重载了所有与RECT,LPCRECT,LPRECT相关 的一些操作,所以在使用时可以不用考虑目的对象具体是 RECT/LPCRECT/LPRECT,因为CRect都会进行自动转换 ! 这个已经说的很清楚了啊 我以前也问过这个问题 呵呵 是因为没看仔细 后来想了想 就明白了
      

  5. typedef struct tagRECT
    {
        LONG    left;
        LONG    top;
        LONG    right;
        LONG    bottom;
    } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
    //
    class CRect : public tagRECT
      

  6. 因为在CRect的成员函数包含了operator LPCRECT,所以可以直接使用,以后发现那个可以直接使用的,就查他的成员函数,里面肯定包含了相应操作。
      

  7. CRect 隐式转换了。下面是CRect 里面的隐式转换运算符重载。
    operator LPRECT();
    operator LPCRECT() const;而 RECT 的情况是因为CRect是从RECT继承下来的,所以CRect也是可以转换成RECT的。 
      

类似问题 »