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);
}

如图, 现在两个对象指向不同的空间, 解决了问题

posted @   许木101  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示