C++:拷贝构造函数和赋值运算符重载

本文详细介绍了C++中的拷贝构造函数,包括概念、特征以及默认行为,以及如何重载赋值运算符,包括格式、要求和默认行为。同时讨论了浅拷贝与深拷贝的区别以及前置++和后置++的重载方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、拷贝构造函数

1.1概念

1.2特征

二、赋值运算符重载

2.1运算符重载

2.2赋值运算符重载

2.2.1赋值运算符重载格式 

2.2.2赋值运算符重载要求

2.2.3默认生成的赋值运算符重载

2.3前置++和后置++重载


一、拷贝构造函数

1.1概念

只有一个形参,这个形参是对类类型对象的引用,在用存在的类类型对象创建时由编译器自动调用。

1.2特征

1.拷贝构造函数是创建与已经存在对象一模一样的新对象。

2.拷贝构造函数一般用const修饰。

3.拷贝构造函数是构造函数的一个重载形式。

4.拷贝构造函数的参数必须是类类型对象的引用,且参数只能有一个。

5.如果用户未定义,编译器会生成默认的拷贝构造函数。默认拷贝构造函数对内置类型对象按内存存储字节序完成浅拷贝,自定义类型是调用其自身的构造函数完成浅拷贝。

class Time
{
public:
	Time()
	{
		_hour = 1;
		_minute = 1;
		_second = 1;
	}
	Time(const Time& t)
	{
		_hour = t._hour;
		_minute = t._minute;
		_second = t._second;
		cout << "Time::Time(const Time&)" << endl;
	}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
private:
	// 基本类型(内置类型)
	int _year = 1970;
	int _month = 1;
	int _day = 1;
	// 自定义类型
	Time _t;
};
int main()
{
	Date d1;
	// 用已经存在的d1拷贝构造d2,此处会调用Date类的拷贝构造函数
	// 但Date类并没有显式定义拷贝构造函数,则编译器会给Date类生成一个默认的拷贝构
	//造函数
	Date d2(d1);
	return 0;
}

6. 虽然编译器会生成默认的拷贝构造函数,但仅仅会完成浅拷贝,如果拷贝的函数涉及空间申请(如stack),则会出现错误(两个函数会申请到同一块空间,销毁时会出现同一块空间释放2次,导致程序崩溃)。

typedef int DataType;
class Stack
{
public:
	Stack(size_t capacity = 10)
	{
		_array = (DataType*)malloc(capacity * sizeof(DataType));
		if (nullptr == _array)
		{
			perror("malloc申请空间失败");
			return;
		}
		_size = 0;
		_capacity = capacity;
	}
	void Push(const DataType& data)
		{
			// CheckCapacity();
			_array[_size] = data;
			_size++;
		}
		~Stack()
		{
			if (_array)
			{
				free(_array);
				_array = nullptr;
				_capacity = 0;
				_size = 0;
			}
		}
private:
	DataType* _array;
	size_t _size;
	size_t _capacity;
};
int main()
{
	Stack s1;
	s1.Push(1);
	s1.Push(2);
	s1.Push(3);
	s1.Push(4);
	Stack s2(s1);
	return 0;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值