一个菜鸟级问题

iawk 2003-09-30 03:22:40
在一个类的构造函数中初始化一个CRect类的对象:
为什么必须写成
class::class():m_rect(0,0,200,200)
{}
而不能写成
class::class()
{
CRect m_rect(0,0,200,200);
}
...全文
20 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovselina 2003-10-01
  • 打赏
  • 举报
回复
三楼的说的经典。我想拜师了~!
enoloo 2003-09-30
  • 打赏
  • 举报
回复

首先要告诉你的是:
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++对象模型>>,侯杰翻译的.
akiko 2003-09-30
  • 打赏
  • 举报
回复
class::class():m_rect(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的初始化要在成员变量初始化表中.
wuxfBrave 2003-09-30
  • 打赏
  • 举报
回复
第二个是在构造函数范围内生成一个局部变量而已
可以
class::class()
{
m_rect = CRect(0,0,200,200);
}
不过这样比第一种效率低,多了一次拷贝
HongHuer 2003-09-30
  • 打赏
  • 举报
回复
建议你在这个论坛去搜索一下。

看看 变量的作用域。
HongHuer 2003-09-30
  • 打赏
  • 举报
回复
而不能写成
class::class()
{
CRect m_rect(0,0,200,200);
}
>>>>>>>>

你还没有分清楚 变量的作用域。

成员变量是要在对象的空间内有效的。

CRect m_rect(0,0,200,200); 你的函数中的,这个变量只在构造函数中有效。

Paris_Luo 2003-09-30
  • 打赏
  • 举报
回复
楼上说的没错
还可以这样写

class::class()
{
m_rect.topLeft= (0,0);
m_rect.bottomRight= (200,200);
}
bluebohe 2003-09-30
  • 打赏
  • 举报
回复
class::class()
{
CRect m_rect(0,0,200,200);
}
仅仅是声明一个局部变量

class::class():m_rect(0,0,200,200)
{}
是初始化类成员
flyelf 2003-09-30
  • 打赏
  • 举报
回复
可以这么写
class:class()
{
m_rect.SetRect(0, 0, 200, 200);
}
lsl7909 2003-09-30
  • 打赏
  • 举报
回复
在C++的语法中第一种方法是初始化类的一个变量,而第二种方法则是在构造函数中另外定义了一个CRect变量,并不是类class的对象。
qwedcxza 2003-09-30
  • 打赏
  • 举报
回复
第二种写法是完全生成一个新的 CRect 了。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧