Clock c = *this;不是浅拷贝,指向同一内存吗,为什么*this的发生变化,c却没有发生变化???

#include <iostream>using namespace std;#include<string>#include<cmath>class Clock {public: Clock(int hour = 0, int minutes = 0, int second = 0) :hour(hour), minutes(minutes), second(second) {}; Clock& operator ++(); Clock operator ++(int); void print() { cout << hour << " " << minutes << " " << second << " "; }public: int hour, minutes, second;};Clock &Clock ::operator++() { second++; if (second >= 60) { minutes++; second = second - 60; } if (minutes >= 60) { hour = (hour + 1) % 24; minutes = minutes - 60; } return *this;}Clock Clock:: operator ++(int) { Clock c = *this; ++(*this); return c;}int main() { Clock cc(23, 59, 59); (cc++).print();}

Clock c=*this是深拷贝,不是浅拷贝

如果改成Clock *c=this才是浅拷贝,运行结果如下

第一种情况下Clock c=*this,c是Clock类变量,*this传的是this指针指向的地址空间里存放的值,是深拷贝,*this变化不影响c

第二种情况下Clock*c=this,c是指向Clock类变量的指针,等于把this指向的地址赋给了c,二者公用地址空间,是浅拷贝,*this变化影响c

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-09-04
这里看怎么理解浅拷贝和深拷贝,一般来说默认拷贝称之为浅拷贝,自己重载等号称之为深度拷贝,不认同也不用喷,不用纠结,来说明一下这个问题。拷贝一般两种情况:
第一种情况:
对象里的成员没有指针类型,这个时候不需要进行重载,赋值执行默认的拷贝,可以理解为浅拷贝。如题中就是这种情况,此时的拷贝是把等号右边对象所在内存的内容完全拷贝至左对象的内存空间,这里注意是内容,不是地址。所以不存在指向同一内存的说法。
第二种情况:
对象的成员有指针类型,
如下:
class Clock
{
int h,m,s;
char *format;
}
此时如果不重载,就执行默认拷贝(浅拷贝),仍然是直接把右对象内存内容拷贝至左对象,左对象成员h,m,s没有问题,但是format这个指针就有点问题了,它被赋值后指向了和右对象中format一样的地址,而自己之前指向的地址已经变成了野指针,没有释放一直占用空间,但是因为没有指针指向它,无法使用。这种情况下我们就需要采用重载等号就行深度拷贝赋值。对于成员一个一个进行赋值,同时对于指针对象,需要把当前指向内存释放,再申请适当内存用于存放新的内容,然后把右边对象指针指向的内容拷贝至新申请的内存空间。
这么解释希望对你理解有帮助。本回答被网友采纳
相似回答