温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++中的拷贝构造是怎样的

发布时间:2022-01-17 13:35:43 来源:亿速云 阅读:151 作者:柒染 栏目:开发技术

这期内容当中小编将会给大家带来有关C++中的拷贝构造是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

拷贝构造函数

同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制或称拷贝是完美可行的,这个拷贝过程只需要拷贝数据成员,而函数成员是公用的(只有一份代码);在建立对象时可用同一类的另一个对象来初始化该对象的存储空间,这时所用的构造函数称为拷贝构造函数

例如:

class Object
{
	int value;
public:
	Object(int x = 0) :value(x) {}
	~Object() {}
	Object(Object& obj):value(obj.value)
	{
		cout << "Copy Create" << endl;
	}
};
int main()
{
	Object obja(10);
	Object objb(obja);//一个对象初始化另一个对象空间,调用拷贝构造
}

当一个对象去初始化另一个对象空间,调用拷贝构造;若类中没有写拷贝构造,如同构造函数与析构函数一样,系统会生成一个缺省的拷贝构造函数

OBject(Object& obj)
{}

拷贝构造中的引用

如果我们在写的拷贝构造不加引用,这样会引起死递归

	//Object(Object& obj):value(obj.value)
	Object(Object obj):value(obj.value)
	{
		cout << "Copy Create" << endl;
	}

为什么拷贝构造函数必须采用引用传参,否则会引发无穷递归呢?

这个问题其实很简单,再复制对象时要分为两个步骤:

第一步:开辟一个临时空间;

第二步:由于临时空间是需要构造的,重新调用拷贝构造函数(无穷递归形成&hellip;)

同时我们可以在拷贝构造参数前加上一个引用,来限制可能会出现的问题

	//Object(Object& obj):value(obj.value)
	Object(const Object& obj):value(obj.value)
	{
		cout << "Copy Create" << endl;
	}
	//这里的const修饰,令我们不能修改被拷贝对象

什么情况会使用拷贝构造

拷贝构造不止在使用一个对象去构造另一个对象时调用,在下面这些情况也会调用:

class Object{int value;public:Object(){cout << "Object::Object" << this << endl;}Object(int x = 0) :value(x){cout << "Object::Object" << this << endl;}~Object(){cout << "Objecet::~Object" << this << endl;}Object(Object& obj) :value(obj.value){cout << "Copy Create" << this << endl;}void SetValue(int x) { value = x; }int GetValue() const { return value; }};Object fun(Object obj){int val = obj.GetValue();Object obja(val);return obja;}int main(){Object objx(0);Object objy(0);objy = fun(objx);return 0;}class Object
{
	int value;
public:
	Object()
	{
		cout << "Object::Object" << this << endl;
	}
	Object(int x = 0) :value(x)
	{
		cout << "Object::Object" << this << endl;
	}
	~Object()
	{
		cout << "Objecet::~Object" << this << endl;
	}
	Object(Object& obj) :value(obj.value)
	{
		cout << "Copy Create" << this << endl;
	}
	void SetValue(int x) { value = x; }
	int GetValue() const { return value; }
};
Object fun(Object obj)
{
	int val = obj.GetValue();
	Object obja(val);
	return obja;
}
int main()
{
	Object objx(0);
	Object objy(0);
	objy = fun(objx);
	return 0;
}

在上面这一段代码中,我们总共创建了几个对象呢,我们来看一下

C++中的拷贝构造是怎样的

首先①②属于对象的构造,调用构造函数;程序运行到objy = fun(objx);进入到fun函数,这是构造临时对象obj③属于拷贝构造;随后④构造对象obja;最后⑤这里也属于拷贝构造也需要创建一个临时对象(将亡值)

并且我们无法将fun函数中obja对象之间return传回给objy,因为在函数结束时obja会析构失效,所以这里会创建一个新的临时对象

C++中的拷贝构造是怎样的

上述就是小编为大家分享的C++中的拷贝构造是怎样的了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI