在构造函数中调用另外一个构造函数若是一不注意就会有无限递归的危险,并且构造函数的参数的不一样也决定了调用的不一样,因此特地总结了一下哪些形式的调用时容许的:函数
首先假设构造函数调用时参数都是外部的变量,而不是一个常量。this
第一种,也是C++11支持的一种调用方式。在函数的初始化列表中调用另外一个构造函数:spa
int b = 2; class Test { public: Test() : Test(b) {} //在初始化列表调用Test(int a) Test(int a) : p(a) {} ~Test() {} int get() { return p; } private: int p; };
第二种,用this指针显示调用构造函数:指针
int b = 2;
class Test
{
public:
Test()
{
this->Test::Test(b); //经过this指针显式调用Test(int a)
}
Test(int a) : p(a) {}
~Test() {}
int get() { return p; }
private:
int p;
};
这种方法必定不能忘记加上做用域,否则编译没法经过!code
第三种,在原始内存覆盖:对象
int b = 2; class Test { public: Test() { new (this) Test(b); } Test(int a) : p(a) {} ~Test() {} int get() { return p; } private: int p; };
上述三种都在对this指向的对象进行操做,若是是想在构造函数中定义一个同类型的变量,须要使用花括号而不是圆括号传参:递归
int b = 2;
class Test
{
public:
Test()
{
Test{ b }; //使用花括号{}
}
Test(int a) : p(a) {}
~Test() {}
int get() { return p; }
private:
int p;
};
另外一种方法是显式指出类型:内存
int b = 2;
class Test
{
public:
Test()
{
Test((int)b); //显式指出类型
}
Test(int a) : p(a) {}
~Test() {}
int get() { return p; }
private:
int p;
};
另外须要注意的是,若是把变量b换成常量2,使用Test(2)不用形成无限递归,会正确执行。作用域
若是编译器支持C++11,那么比较推荐的方法是使用初始化列表来调用其它构造函数。get