深浅复制问题在与类内有指针的情况下,默认拷贝构造函数只会为指针赋值,使其指向被拷贝对象的指针指向的内存地址,并不会另外单独为其申请一段内存空间;
默认的拷贝构造函数就只能实现浅复制,要达到深复制就要重载拷贝构造函数,动态分配内存,拷贝类对象指针所指向的值;
eg.
#include <iostream>#include <cstring>using namespace std;/** 拷贝构造函数 深复制和浅复制*/class Point {public: Point() : x(0), y(0) {} Point(int x, int y) { this->x = x; this->y = y; str = new char[100]; strcpy(str, "To do Something.../n"); } int getX() { return x; } int getY() { return y; } ///浅复制 --> 默认拷贝构造函数 /*Point(Point &p) { x = p.x; y = p.y; str = p.str; }*/ ///深复制 Point(Point &p) { x = p.x; y = p.y; str = new char[strlen(p.str) + 1]; strcpy(str, p.str); } ~Point() { delete []str; } void setStr(char *nStr) { strcpy(str, nStr); } void showStr() { cout << str << endl; }PRivate: int x, y; char *str;};int main(){ cout << "First Point object" << endl; Point p(6, 8); cout << p.getX() << endl; cout << p.getY() << endl; p.showStr(); ///浅复制 cout << "Second Point object" << endl; Point q(p); cout << q.getX() << endl; cout << q.getY() << endl; q.showStr(); cout << "Change first object string/n" << endl; p.setStr("New Word!"); /** 指向同一个字符串 释放内存时被释放了两次 */ p.showStr(); q.showStr(); return 0;}调用拷贝构造函数 1.当用类的一个对象去初始化该类的另一个对象时;(XXX p(q) 或 XXX p = q)
2.如果函数的形参是类的对象,调用函数时,进行形参和实参的结合时; (形参为引用变量除外)
3.如果函数的返回值是类的对象,函数执行完成返回调用者时;(默写IDE做了一些优化,导致并不会调用)参考
新闻热点
疑难解答