关于构造函数的精确调用时机

ztfans 2003-09-13 05:33:32
请看如下示例:
class test{
public:
test(){cout<<"test constructor"<<endl;i=1}
int i;
};

void main(){
test mytest; //#1
cout<<"********"<<endl; //#2
test.i++; //#3
}

《C++ primer》第568页倒数第12行说“C++要求,在类对象首次被使用之前,构造函数将被应用在该对象上”,(本书中其他的地方也有类似的说法)。照这种说法,在上例中,它只保证test的构造函数在#3之前调用就行了,可究竟是在#2之前还是#2之后呢?这将会导致运行的结果有两种:

test constructor
********


********
test constructor

虽然我在大多数编译器上测试结果是前者,但《C++ primer》的这种说法未免有点不严格,不像《深度探索C++对象模型》中对此用伪码表示来得精确:

//《深度探索C++对象模型》中的伪码表示
void main(){
test mytest;
mytest.test::test();
cout<<"********"<<endl;
test.i++;
}
这种伪码表示就严格决定了上例中的运行结果是前一种。

也许有人说我未免小题大做、无事生非,但作为一个c++迷,不把一些问题弄清楚行吗?

请高手们对此问题发表点看法!
...全文
49 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cenphoenix 2003-09-13
  • 打赏
  • 举报
回复
我也在看c++ primer 不过今天才看到500页,要努力啊
dreamfly8848 2003-09-13
  • 打赏
  • 举报
回复
同意楼上的!

#1就己经执行了!
jp311 2003-09-13
  • 打赏
  • 举报
回复
考虑一个效率问题
如果实例没有被使用,在定义的时候就构造是不是有些浪费
有没有可能在对象真正被使用的时候在构造它呀,这样效率岂不是更高

不过幸亏C++可以在任何地方定义对象,可以轻松实现在对象被使用之前才被构造
Bjarne Stroustrup果然大师也
sevencat 2003-09-13
  • 打赏
  • 举报
回复
所以才建议在使用的时候再定义一个类。
gernal_dn 2003-09-13
  • 打赏
  • 举报
回复
记住!构造函数不是被调用的!!!
构造函数是用于类的实例化时(声明一个变量)作一些初始化工作,比如,有指针的化,为它申请一些内存之类。
bm1408 2003-09-13
  • 打赏
  • 举报
回复
同意楼上的!

#1就己经执行了!
emmyjeff 2003-09-13
  • 打赏
  • 举报
回复
在类的实例被定义时(注意不是声明时),因此在1#
test mytest;
就执行
ztfans 2003-09-13
  • 打赏
  • 举报
回复
我的意思不是说这句话有错,而只是说这句话留下的余地太大。
csdn5211 2003-09-13
  • 打赏
  • 举报
回复
“C++要求,在类对象首次被使用之前,构造函数将被应用在该对象上”这句话本身也没有错,难道不是这样吗?
Yssss1980 2003-09-13
  • 打赏
  • 举报
回复
《C++ primer》第568页倒数第12行说“C++要求,在类对象首次被使用之前,构造函数将被应用在该对象上”,(本书中其他的地方也有类似的说法)。

/////////////
他说 在类对象首次被使用之前,但是没有说 刚刚在使用之前一步啊

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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