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; }
为什么拷贝构造函数必须采用引用传参,否则会引发无穷递归呢?
这个问题其实很简单,再复制对象时要分为两个步骤:
第一步:开辟一个临时空间;
第二步:由于临时空间是需要构造的,重新调用拷贝构造函数(无穷递归形成…)
同时我们可以在拷贝构造参数前加上一个引用,来限制可能会出现的问题
//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 = https://www.it610.com/article/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 = https://www.it610.com/article/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; }
在上面这一段代码中,我们总共创建了几个对象呢,我们来看一下
文章图片
首先①②属于对象的构造,调用构造函数;程序运行到objy = fun(objx); 进入到fun函数,这是构造临时对象obj③属于拷贝构造; 随后④构造对象obja;最后⑤这里也属于拷贝构造也需要创建一个临时对象(将亡值)
并且我们无法将fun函数中obja对象之间return传回给objy,因为在函数结束时obja会析构失效,所以这里会创建一个新的临时对象
文章图片
总结 【C++中的拷贝构造详解】本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- 聊聊SpringCloud中的Ribbon进行服务调用的问题
- R语言入门课|R语言导入数据文件(数据导入、加载、读取)、使用Hmisc包的spss.get函数导入SPSS中的por格式文件
- 深度学习|深度学习中的优化标准(交叉熵与均方误差)
- c++|c++ 11 线程池---完全使用c++ 11新特性
- 详解Java中的抽象类和抽象方法
- 自己动手写Vector【Cherno|自己动手写Vector【Cherno C++教程】
- C++|C++ std::shared_mutex读写锁的使用
- C#中的EventHandler观察者模式详解
- javascript学数组中的foreach方法和some方法
- javascript数组中的map方法和filter方法