Bingo, Computer Graphics & Game Developer
struct CLS
{
int m_i;
CLS( int i ):m_i(i){}
CLS()
{
CLS(0);
}
};
int main()
{
CLS obj;
// obj.m_i = ?
return 0;
}
从这里,我们归纳如下:
1)在c++里,由于构造函数允许有默认参数,使得这种构造函数调用构造函数来重用代码的需求大为减少
2)如果仅仅为了一个构造函数重用另一个构造函数的代码,那么完全可以把构造函数中的公共部分抽取出来定义一个成员函数(推荐为private),然后在每个需要这个代码的构造函数中调用该函数即可
3)偶尔我们还是希望在类的构造函数里调用另一个构造函数,可以按下面方式做:
在构造函数里调用另一个构造函数的关键是让第二个构造函数在第一次分配好的内存上执行,而不是分配新的内存,这个可以用标准库的placement new
做到:
先看看标准库中
placement new
的定义
inline void *__cdecl operator new(size_t, void *_P)
{
return (_P);
}
可见没有分配新的内存。
正确的方式:
struct CLS
{
int m_i;
CLS( int i ) : m_i(i){}
CLS()
{
new (this)CLS(0);
}
};
另: 若构造函数调用自身,则会出现无限递归调用,是不允许的
若是构造函数嵌套调用 那么第二次调用产生的是匿名对象 也就是说 无论在第二次的构造函数中赋任何值 都会被作为临时对象给抹去 那么出了第一次的构造函数相当于没有初始化任何东西