| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 897 人关注过本帖
标题:[讨论]构造函数内调用构造函数的合法性?
只看楼主 加入收藏
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
结帖率:100%
收藏
 问题点数:0 回复次数:5 
[讨论]构造函数内调用构造函数的合法性?
看下面一段代码:
class CLS{
public:
CLS( int i ) : m_i(i) {}
CLS()
{
CLS(0);
}
int m_i;
};
CLS obj;
cout << obj.m_i << endl; //输出结果是什么?

这是一个面试题,测试输出是不定的,有人说在构造函数内调用构造函数是非法的,但实际上编译器是并没有报错或警告。

今天在看《Effective c++》Third Edition 的时候,在 Item14:Think carefully about copy behavior in resource-managing classes.有这样的代码:

void lock(){Mutex *pm}
void unlock (){ Mutex *pm }
class Lock
{
public:
explicit Lock(Mutex *pm):MutexPtr(pm){}
~Lock (){ unlock(mutexPtr);}
private:
Mutex *mutexPtr;
};

《Effective c++》也算是本比较权威的书。大师们应该不会范低级的错误吧。那么,构造函数内调用构造函数是不是非法的呢?为什么?大家讨论下。

[此贴子已经被作者于2007-9-11 15:19:35编辑过]

搜索更多相关主题的帖子: 构造函数 CLS 合法性 Mutex obj 
2007-09-11 13:18
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 

怎么这么冷呢,顶上去!



#include <iostream>
using namespace std;

class CTest
{
public:
CTest();
CTest(int a);
void print() const
{
cout<<i<<" "<<j<<endl;
}
private:
int i,j;
};

CTest::CTest()
{
i=2;
}

CTest::CTest(int a)
{
j=a;
CTest(); //此语句新建了一个临时对象,随即析构。并没有
} //改变i的值。


int main()
{
CTest demo(8);
demo.print();
system("pause");
return 0;
}
在网上查了点资料,这个看起来有点道理,大家测试看看。i的值并没有改变。。也就是说i并没有被初始化或赋值。


大家继续讨论哈。


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-09-11 22:16
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
想不出哪不合法。

继承不是也在调用基类的构造函数吗?

应该,可以吧!

Fight  to win  or  die...
2007-09-11 22:16
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 
恩,我想也是,书上有类似的代码,而且编译器测试也没问题,可能有它特别的用处吧

Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-09-11 23:18
reedleaf
Rank: 2
等 级:新手上路
威 望:3
帖 子:62
专家分:0
注 册:2007-8-5
收藏
得分:0 
2楼很有道理
我在vc上试了一下。
输出不定。

调试:
在CLS()出设置端点可以看到CLS(0)中CLS(0).m_i的值是0;运行结束obj.m_i并没有被初始化。

2007-09-12 00:28
Arcticanimal
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:341
专家分:20
注 册:2007-3-17
收藏
得分:0 
构造函数的调用不能有隐式的或显式的this限定, 而成员函数的调用必须有this来限定
constructor(parameter)
{
memberfuntion();
// The previous calling of member function actually runs like this:
this->memberfunction();

constructor(parameter); // OK ! It just builds another object on the stack and return the object.

// However the following calling of constructor won't compile
// this->constructor(parameter) // ERROR !
}
这也即是构造函数不可以显式调用的原因
呵呵,个人理解,欢迎指正

try new catch
2007-09-12 16:07
快速回复:[讨论]构造函数内调用构造函数的合法性?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048006 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved