构造函数中不能调用本类中的另一构造函数
class Foo {
public:
Foo(char x){
Foo(x, 0); //本语句无法初始化当前对象!
}
Foo(char x, int y);
};
上面例子中,Foo(x,0)语句并不调用当前对象的Foo(char x, int y)函数,而是 产生一个临时对象并对其初始化,然后在语句结束时(分号处)销毁临时对象。因此当前对象并未得到初始化,这恐怕出乎很多人的意料。
解决这个问题,常见的办法是合并构造函数并使用默认参数:
class Foo {
public:
Foo(char x, int y=0); //本行合并了两个构造函数
...
};
如果不方便合并,则可将公共部分放到一个private函数中,规避构造函数的相互调用。示意代码如下:
class Foo {
public:
Foo(char x) { init(x, 0); }
Foo(char x, int y) { init(x, y); }
...
private:
void init(char x, int y);
};
参考资料: http://www.parashift.com/c++-faq-lite/init-methods.html