深浅复制问题在与类内有指针的情况下,默认拷贝构造函数只会为指针赋值,使其指向被拷贝对象的指针指向的内存地址,并不会另外单独为其申请一段内存空间;
默认的拷贝构造函数就只能实现浅复制,要达到深复制就要重载拷贝构造函数,动态分配内存,拷贝类对象指针所指向的值;
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做了一些优化,导致并不会调用)参考