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

关于构造函数中类成员变量赋值和 构造函数传递指针?解决方法

2012-02-10 
关于构造函数中类成员变量赋值和 构造函数传递指针?定义一个POINTpoint类型的变量为什么构造函数初始化时

关于构造函数中类成员变量赋值和 构造函数传递指针?
定义一个POINT   point;类型的变量   为什么构造函数初始化时只要point=0;就可以了?
难道在POINT类中重载了 "= "?

POINT   m_point,point;
CClientDC   dc(this);
CBrush   brush(RGB(0,0,255));
dc.FillRect(CRect(m_point,point),&brush);
但是函数定义为这样   void   FillRect(LPCRECT   lpRect,CBrush*   pBrush);
第一个参数是指向一个RECT结构的指针   为什么用这样的形式CRect(m_point,point)就可以传递一个指针了呢?
CRect(m_point,point)这是CRect类的构造函数啊   这和传递指针有什么关系?难道这样就能创建一个CRect临时对象?然后把地址赋给第一个参数?


[解决办法]
#1: POINT类应该没有重载 "= ",这种情况下c++会执行缺省动作: memory覆盖.因此,point中的内容都为0

#2: 首先,CRect(m_point,point)生成了一个CRect对象,然后编译器发现FillRect()的第一个参数是LPRect类型,这时编译器会从两方面着手解决问题:
(1) LPRect类有没有参数为CRect的构造函数
(2) CRect类有没有成员函数operator LPRect()
(1)-no, (2)-yes, 因此就执行(2)得到LPRect.
[解决办法]
CRect(m_point,point) 这样构造了一个 CRect 对象,
CRect 类型中定义了 LPCRECT 类型转换操作符,
所以, CRect 可以被自动的转换为LPCRECT ,
因此,dc.FillRect(CRect(m_point,point),&brush); 没有问题 ~
[解决办法]
POINT 应该是一个 struct,
对于 struct, 定义时候初始化可以采用类似的方式: POINT point={0,0};
但是赋值的时候是不允许 point={0,0} 这样的,只能逐个元素赋值。

请区分 初始化和赋值

热点排行