VC++ MFC CRect中opearor LPRECT如何实现。

MFC中将CRect向参数为RECT函数传参时,并不会发生参数类型错误信息、网上说由于在CRect类中重载了LPRECT,最终传入的是一个LPRECT指针,这个重载函数是... MFC中将CRect向参数为RECT函数传参时,并不会发生参数类型错误信息、网上说由于在CRect类中重载了LPRECT,最终传入的是一个LPRECT指针,这个重载函数是如何完成的?(思路)。另外在传入CRect参数时,并没有使用LPRECT操作符,而是直接传参就可以。这是为什么呢,隐式转换调用了重载函数吗?期待您的完美回答。 展开
 我来答
相思丶猫2C
2012-11-13 · TA获得超过1198个赞
知道小有建树答主
回答量:1432
采纳率:50%
帮助的人:952万
展开全部
首先确定这是一个重载。就好比int a = 5; 凭什么 = 就能直接用。c语言也许想当然,但是到java中你就会明白 = 其实是重载了的。再比如 char c = 65;这其实都是编译器做好了转换。如果不做转换,编译都不能通过。
返回的LPRECT很简单,也许CRect里面有个成员变量RECT rc,那么重载函数返回 &rc 就行了。
sun1yu1jia1
2015-07-13 · TA获得超过1066个赞
知道小有建树答主
回答量:1178
采纳率:62%
帮助的人:530万
展开全部

它重载了LPRECT。直接看MFC的源码。判断参数类型时,发现CRect中有LPRECT类型转换操作符,就会调这个操作符重载函数。


代码(atltypes.h):

class CRect : public tagRECT
{
....
// convert between CRect and LPRECT/LPCRECT (no need for &)
operator LPRECT() throw();
operator LPCRECT() const throw();
};



代码:atltypes.inl

ATLTYPES_INLINE CRect::operator LPRECT() throw()
{
return this;
}
ATLTYPES_INLINE CRect::operator LPCRECT() const throw()
{
return this;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bhtzu
2015-05-16 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4190万
展开全部

CRect确实重载了LPRECT操作,并且可以直接将CRect作为LPRECT类型的参数带入。

其实CRect重载的LPRECT操作非常简单,函数中就是一句:return this;

this是对象自身的指针,为什么返回自身就可以获得LPRECT呢,这里看下面两段代码:

typedef struct tagRECT
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

class CRect : public tagRECT
{
//略...
};

第一段代码说明,LPRECT就是RECT结构体指针

第二段代码说明,CRect类的基类就是RECT结构体!

根据C++的类重载和继承原则,子类的指针转换为父类指针是没有问题的,因此CRect的this可以成为RECT的结构体指针,这才是LPRECT操作的真是面目!

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ziyang64
2012-11-13 · TA获得超过962个赞
知道小有建树答主
回答量:529
采纳率:0%
帮助的人:812万
展开全部
确实是重载了LPRECT。直接看MFC的源码。判断参数类型时,发现CRect中有LPRECT类型转换操作符,就会调这个操作符重载函数。
atltypes.h中的:
class CRect : public tagRECT
{
....
// convert between CRect and LPRECT/LPCRECT (no need for &)
operator LPRECT() throw();
operator LPCRECT() const throw();
};

atltypes.inl中的:

ATLTYPES_INLINE CRect::operator LPRECT() throw()
{
return this;
}
ATLTYPES_INLINE CRect::operator LPCRECT() const throw()
{
return this;
}
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式