首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怪异的操作符 重载 看了一天都没看明白,该如何解决

2012-02-24 
怪异的操作符 重载看了一天都没看明白以下是VC++.NET技术内幕(6板)57页的代码CRectrectClientGetClienRec

怪异的操作符 重载 看了一天都没看明白
以下是VC++.NET技术内幕(6板)57页的代码

CRect   rectClient;
GetClienRect(rectClient);
----------------------------
GetClientRect的原型:
void   GetClientRect(
      LPRECT   lpRect  
)   const;

书上给出的解释:GetClienRect的参数是一个指向RECT结构的指针.因为CRect类定义了重载操作符LPRECT(),该操作符返回CRect对象地址,它等价于RECT对象地址.

这一切都可以理解和明白
关键是:   这个操作符重载是怎么实现的?????????????
我在MSDN上看了下
Converts   a   CRect   to   an   LPRECT.

operator   LPRECT(   )   throw(   );
Remarks
When   you   use   this   function,   you   don 't   need   the   address-of   (&)   operator.   This   operator   will   be   automatically   used   when   you   pass   a   CRect   object   to   a   function   that   expects   an   LPRECT.

Example
void   CYourView::OnInitialUpdate()
{
      //   CWnd::GetWindowRect()   takes   a   LPRECT,   but   we   can
      //   simply   pass   our   CRect   object   because   of   the   LPRECT
      //   cast   operator   in   the   CRect   class.

      CRect   rect;
      GetWindowRect(rect);

      //   Similarly,   CWnd::MoveWindow()   takes   a   LPCRECT   but
      //   the   LPCRECT   cast   operator   is   used   implicitly:

      MoveWindow(rect,   FALSE);

      //   ...   more   code   here   ...
}


就这些,没看到如何实现的,只是运用
用的时候也没见任何重载符号,杂个就重载了


[解决办法]
你还是找本c++ Primer,看“自定义类型转帐符”吧
[解决办法]
operator LPRECT( ) throw( );这个就是声明啊
[解决办法]
比如:
A::operator int() const
{
return int(mem);
}
[解决办法]
同理,operator LPRECT( )只要把 CRect 类封装的 Rect 结构体地址返回就可以了 ~
[解决办法]
operator LPRECT( ) throw( )
{
return this;
}
[解决办法]
上面的这种重载,上典型的类型转换重载。
就是说类CRect 做了一个向LPRECT转换的方法。


有了这个方法 CRect 就可以向LPRECT转型。 本质上和char向int转型是一样的。
只不过一个是语言自身就实现了的。( char==》int )
一个是编程的人实现的。( CRect ==》 LPRECT )

函数operator LPRECT( ) throw( )
{
return this;
}
就是实现 CRect ==》 LPRECT 的功能的。
[解决办法]
楼上正解
[解决办法]
类型转换重载,
假如类A和B是没有直接关系的两个类,但类A有一个转换到B的类型转换操作符:
A::operator B() {....}

那么,如果有一个函数想要一个类B的对象:
void f(B);
那么你可以把一个类A的对象传进去:
A a;
f(a);
[解决办法]
以上只是个例子,类型转换操作符当然不止用在参数传递中。
[解决办法]
比较好懂的类型转换符就是在string类里面


class string
{
public:
operator const char*() //定义了一个向const char*的转换,
{
return data;
}
private:
char *data;
};

void F1(const char*p)
{
}
void main()
{
string str;
F1(str); //这时候,str就自动去调用它的那个转换成const char*的函数,来
} //满足F1函数的需要
[解决办法]
楼主说的操作符重载不是类型转换函数,
它们是两个不同的东西
操作符重载比如

class A
{
A& operator=(const A&a) //重载的=号操作符
{
x=a.x;
y=a.y;
return *this;
}
private:
int x,y;
}
void main()
{
A a;
A b;
a.x=3;
a.y=5;
b=a; //调用了重载的=号操作符,以后,实现了b.x=3,b.y=5
}

热点排行