拷贝构造与赋值:浅拷贝vs深拷贝,面试里最容易踩的坑
📅 2026/7/14 19:45:34
👁️ 阅读次数
📝 编程学习
上篇聊了构造函数和析构函数,今天接着讲它的"兄弟"——拷贝构造和赋值。
这个话题在面试里出现频率很高。而且很多人不是不知道概念,而是在具体场景下判断不出该用浅拷贝还是深拷贝。
讲个我自己的教训。刚工作不久,写了个传感器数据管理的类。内部用了一个指针数组存数据。我嫌麻烦,没写拷贝构造函数,觉得编译器自动生成的够用了。
结果程序跑着跑着就崩了。
排查了半天,发现是vector扩容的时候,拷贝了对象,但编译器生成的拷贝构造函数只做了浅拷贝——指针复制了一份,两个对象指向同一块内存。一个对象析构的时候把内存释放了,另一个对象还在用这块内存,直接野指针。
从那以后,我对拷贝构造和赋值再也不敢偷懒。
拷贝构造函数:什么时候调用
拷贝构造函数在三种情况下被调用:
第一,用一个对象初始化另一个对象。
Sensor s1; Sensor s2 = s1; // 调用拷贝构造 Sensor s3(s1); // 调用拷贝构造第二,函数参数是值传递的对象。
void processSensor(Sensor s) { // 值传递,调用拷贝构造 // 处理s } Sensor s1; processSensor(s1); // s1被拷贝一份传给s第三,函数返回一个局部对象(有些编译器会做返回值优化,省略拷贝)
Sensor createSensor() { Sensor s; return s; // 可能调用拷贝构造(也可能被RVO优化掉
编程学习
技术分享
实战经验