我是靠谱客的博主 欢呼白云,最近开发中收集的这篇文章主要介绍c++中构造函数的相互调用c++中构造函数的相互调用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

c++中构造函数的相互调用

在构造函数中调用另一个构造函数如果一不注意就会有无限递归的危险,而且构造函数的参数的不同也决定了调用的不同,所以特意总结了一下哪些形式的调用时允许的:

首先假设构造函数调用时参数都是外部的变量,而不是一个常量。

第一种,也是C++11支持的一种调用方式。在函数的初始化列表中调用另一个构造函数:(推荐此方法)

说明:推荐此法

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指针显示调用构造函数:

说明:g++中不能编译,vs可以

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;
};

第三种,在原始内存覆盖:

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,那么比较推荐的方法是使用初始化列表来调用其它构造函数。

最后

以上就是欢呼白云为你收集整理的c++中构造函数的相互调用c++中构造函数的相互调用的全部内容,希望文章能够帮你解决c++中构造函数的相互调用c++中构造函数的相互调用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部