C++学习笔记-----在一个构造函数中调用另外一个构造函数

在构造函数中调用另外一个构造函数若是一不注意就会有无限递归的危险,并且构造函数的参数的不一样也决定了调用的不一样,因此特地总结了一下哪些形式的调用时容许的:函数

首先假设构造函数调用时参数都是外部的变量,而不是一个常量。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;
};

使用new (void*p) Type(...),这种语句的意思是不从新分配内存,而是直接覆盖在原内存上。就本例而言,定义一个Test类型的变量覆盖在this地址指向的内存上。


上述三种都在对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