在一个类的构造函数中初始化一个CRect类的对象:
为什么必须写成
class::class():m_rect(0,0,200,200)
{}
而不能写成
class::class()
{
CRect m_rect(0,0,200,200);
}
为什么必须写成
class::class():m_rect(0,0,200,200)
{}
而不能写成
class::class()
{
CRect m_rect(0,0,200,200);
}
解决方案 »
- MFC ODBC 如果不从CRecordset派生自己的类,如何将日期(如2010-2-2 13:00:00)写入Access数据库
- 备忘录应该如何设计?
- 长按Spin控件的上或下按钮时,步长pNMUpDown->iDelta为什么会变化?
- 快来接分了!!virtual BOOL InitInstance();方法怎么没有被执行!
- pCmdUI->SetCheck(1);不起作用!?
- 帮帮忙,怎么在ListCtrl中的某一列里面设置为可以输入的文本框??
- 有谁做过在Edit类控件里设置链接的?高分
- 指导方向
- 紧急问题。 SOS !!!! 100分
- hookapi WriteProcessMemory写入的字符串比原来的长度长怎么办??? 大多数操作系统正常。win8.1 x64不正常 出错 move b
- 请问如何得到用new分配空间的大小
- 放分庆祝:日军化武中国受害者东京胜诉
class:class()
{
m_rect.SetRect(0, 0, 200, 200);
}
{
CRect m_rect(0,0,200,200);
}
仅仅是声明一个局部变量
而
class::class():m_rect(0,0,200,200)
{}
是初始化类成员
还可以这样写class::class()
{
m_rect.topLeft= (0,0);
m_rect.bottomRight= (200,200);
}
class::class()
{
CRect m_rect(0,0,200,200);
}
>>>>>>>>你还没有分清楚 变量的作用域。成员变量是要在对象的空间内有效的。CRect m_rect(0,0,200,200); 你的函数中的,这个变量只在构造函数中有效。
可以
class::class()
{
m_rect = CRect(0,0,200,200);
}
不过这样比第一种效率低,多了一次拷贝
而不能写成
class::class()
{
CRect m_rect(0,0,200,200);//这个只是产生了一个临时的m_rect
}
楼主问的估计不是这个意思
假设
class::class()
{
m_xxx=XXX;//这里不是对m_xxx进行初始化,此时的m_xxx已经调用了默认的构造函数了!!!
//这里只是operator=而已.
}
一般对于一个class中,有另一个class的object作为成员变量,这个object的初始化要在成员变量初始化表中.
首先要告诉你的是:
class::class()
{
CRect m_rect(0,0,200,200);//这个只是产生了一个临时的m_rect
}
m_rect在class::class()函数结束后将析构,也就是说这个对象就不存在了.再举个例子:
int a=100;
{
int a=70;
cout<<a<<endl;//输出70
}
cout<<a<<endl;//输出100
你可以试试,因为第二个a在括号之外就没有作用域了, 你可以看看作用域方面的书,很多c++教程都有.
然后,class::class():m_rect(...)是初始化变量(m_rect 在类中要有定义哦).
他的作用是很明显的,比如:
class cls
{
const int a;
public:
cls(int param):a(param){};//chu shi hua,正确.
};
一个const 成员如果你这样:cls::cls(int param){a=param;} //error,因为不能给一个const成员复值.
所以,很多地方要用到初始化的.
说这么多不知道你乐不乐意看完,但是,这是一些很基础的东西,一定要懂的
你可以参考<<c++对象模型>>,侯杰翻译的.