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

如图, 现在两个对象指向不同的空间, 解决了问题
浙公网安备 33010602011771号