标签:原因 pac name warnings 变量 %s 构造 obj 申请
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\n",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\n",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; }
上述代码中的红色部分,手动实现的拷贝构造函数中申请一块新的内存,然后对数据进行拷贝。
标签:原因 pac name warnings 变量 %s 构造 obj 申请
原文地址:https://www.cnblogs.com/weiyouqing/p/9656924.html