C++类和对象: 拷贝构造函数
1. 拷贝构造函数
概念与定义
拷贝构造函数也是一个默认的成员函数, 其完成拷贝对象的工作
定义拷贝构造:
函数名与类名相同, 无返回值
拷贝构造函数的参数只能有一个, 且必须是类型对象的引用, 如下例
这里一定要注意, 形参必须是类型对象的引用或指针,否则会引发无穷递归调用,如下图
特性解析
1. 若未显式定义,编译器会生成默认的拷贝构造函数, 如下图
如图, 没有显示定义拷贝构造, 但是d2还是拷贝了d1的值, 这说明编译器的确会生成默认的拷贝构造完成拷贝
那么编译器默认生成的拷贝构造有什么问题吗?
2. 编译器默认生成的拷贝构造只能完成浅(值)拷贝
浅拷贝或值拷贝只是按字节序, 将一个对象拷贝给一个对象, 这种拷贝方式在上一个例子日期类中是没有问题的
但是在这里会有很多问题, 比如两个对象会指向同一块内存空间, 最后析构时会把一个空间析构两次,一个修改会影响另一个
所以, 这个时候就不能使用编译器默认生成的拷贝构造, 而是需要我们自己写一个深拷贝
#include <iostream> using namespace std; typedef int DataType; class Stack { public: // 拷贝构造 - 深拷贝 Stack(const Stack& st) { _array = (int*)malloc(sizeof(int) * st._capacity); if (nullptr == _array) { perror("malloc申请空间失败"); return; } memcpy(_array, st._array, sizeof(int) * st._top); _top = st._top; _capacity = st._capacity; } // 构造函数 Stack() { _array = (DataType*)malloc(sizeof(DataType) * 4); if (NULL == _array) { perror("malloc申请空间失败!!!"); return; } _capacity = 4; _top = 0; } // 析构函数 ~Stack() { free(_array); _capacity = 0; _top = 0; } private: DataType* _array; int _capacity; int _top; }; int main() { Stack st1; Stack st2(st1); }
如图, 现在两个对象指向不同的空间, 解决了问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!