VC++ MFC CRect中opearor LPRECT如何实现。
MFC中将CRect向参数为RECT函数传参时,并不会发生参数类型错误信息、网上说由于在CRect类中重载了LPRECT,最终传入的是一个LPRECT指针,这个重载函数是...
MFC中将CRect向参数为RECT函数传参时,并不会发生参数类型错误信息、网上说由于在CRect类中重载了LPRECT,最终传入的是一个LPRECT指针,这个重载函数是如何完成的?(思路)。另外在传入CRect参数时,并没有使用LPRECT操作符,而是直接传参就可以。这是为什么呢,隐式转换调用了重载函数吗?期待您的完美回答。
展开
展开全部
它重载了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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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操作的真是面目!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
确实是重载了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;
}
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;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询