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 @ 2023-05-03 15:37  许木101  阅读(33)  评论(0)    收藏  举报