怪异的操作符 重载 看了一天都没看明白
以下是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
}