浅拷贝构造函数与深拷贝构造函数
Posted weiyouqing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅拷贝构造函数与深拷贝构造函数相关的知识,希望对你有一定的参考价值。
1.浅拷贝构造函数
#include <iostream> using namespace std; class Base { public: int x; }; class Object : public Base { public: Object(int a,int b) { this->a = a; this->b = b; } Object(const Object &other): Base(other) //手动添加的拷贝构造函数,对基类拷贝构造函数 { cout << "this is copy+" << endl; this->a = other.a; this->b = other.b; } private: int a; int b; }; int main(int argc, char * argv[]) { Object obja(1, 2); obja.x = 123; Object objb(obja); system("pause"); return 0; }
浅拷贝构造函数:1.浅拷贝构造函数中必须对每个成员变量进行拷贝;
2.继承的类,必须对父类进行拷贝;
3.浅拷贝构造函数可省略,系统会有默认拷贝构造函数,就是对类的成员变量进行一一拷贝;
2.深拷贝构造函数-必须实现构造函数
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Object { public: Object(char * str) { m_size = strlen(str)+1; m_buf = new char[m_size]; strcpy(m_buf,str); printf("%s ",m_buf); } ~Object() { delete[] m_buf; } private: char *m_buf; int m_size; }; int main(int argc, char * argv[]) { Object obja("hello world"); Object objb(obja); system("pause"); return 0; }
上述代码在析构时,出现错误:
主要原因是因为使用了系统的默认拷贝构造函数,相当于执行了以下代码:
objb.m_buf = obja.m_buf;
objb.m_size = obja.m_buf;
这样两个对象指针,指向了同一块内存;
析构时,先析构了obja,指向的内存被释放,再析构objb时,发现内存已经被释放,导致程序崩溃;
因此,此时需要手动写一个拷贝构造函数,目的是拷贝数据,而不是拷贝指针;见如下代码:
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Object { public: Object(char * str) { m_size = strlen(str)+1; m_buf = new char[m_size]; strcpy(m_buf,str); printf("%s ",m_buf); } ~Object() { delete[] m_buf; } Object(const Object &other) { m_size = other.m_size; m_buf = new char[m_size]; strcpy(m_buf,other.m_buf); } private: char *m_buf; int m_size; }; int main(int argc, char * argv[]) { Object obja("hello world"); Object objb(obja); system("pause"); return 0; }
上述代码中的红色部分,手动实现的拷贝构造函数中申请一块新的内存,然后对数据进行拷贝。
以上是关于浅拷贝构造函数与深拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章