注册 登录
编程论坛 C++教室

[讨论]构造函数内调用构造函数的合法性?

yuyunliuhen 发布于 2007-09-11 13:18, 912 次点击
看下面一段代码:
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编辑过]

5 回复
#2
yuyunliuhen2007-09-11 22:16

怎么这么冷呢,顶上去!



#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并没有被初始化或赋值。


大家继续讨论哈。

#3
aipb20072007-09-11 22:16
想不出哪不合法。

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

应该,可以吧!
#4
yuyunliuhen2007-09-11 23:18
恩,我想也是,书上有类似的代码,而且编译器测试也没问题,可能有它特别的用处吧
#5
reedleaf2007-09-12 00:28
2楼很有道理
我在vc上试了一下。
输出不定。

调试:
在CLS()出设置端点可以看到CLS(0)中CLS(0).m_i的值是0;运行结束obj.m_i并没有被初始化。
#6
Arcticanimal2007-09-12 16:07
构造函数的调用不能有隐式的或显式的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 !
}
这也即是构造函数不可以显式调用的原因
呵呵,个人理解,欢迎指正
1