拷贝构造函数与赋值函数的爱恨情仇

在类的成员函数中,可以访问到同类对象的的私有属性

一:拷贝构造函数:

面试-什么时候需要将参数声明为常引用?
  1. & 防止形参实参结合时调用 拷贝构造函数
  2. const 防止传入的实参 在函数执行过程中被改变
1- 什么时候调用:
  1. 用一个对象初始化另一个对象时
  2. 函数的参数是类的对象,在函数调用 形参实参结合时
  3. 函数的返回值是类的对象,在函数调用完成返回时
2- 注意:
  • 性能消耗大,形参实参结合时常为了避免调用拷贝构造函数而使用 本类对象的常引用
  • 在需要实现深拷贝时重写拷贝构造函数和赋值构造函数
class MyVector {
private:
    // 当类中有指针型成员变量时,要重写拷贝构造函数+赋值函数
	int *vecPtr;
	int maxSize;
	int nowSize;
public:
//	  Constructors 构造函数
	MyVector(int defaultSize = 4):nowSize(0), maxSize(defaultSize) {
		vecPtr = new int[this->maxSize];
	}
	// 拷贝构造函数
	MyVector(const MyVector& g) {
		this->nowSize = g.nowSize; // 传入的对象,的私有成员,可以在类中的函数被访问到
		this->maxSize = g.maxSize;
		this->vecPtr = new int[g.maxSize];
		// 拷贝多少个字节过来 -> 要用到  sizeof
		memcpy(this->vecPtr, g.vecPtr, nowSize * sizeof(int)); 
	}
	// 拷贝构造函数和赋值函数,参数为本类对象的常引用
	// 用一个对象给另一个对象赋值时调用赋值函数,(另一个对象已经存在)
	// 要连续 赋值(a = b = c; ),所以返回值 要为 常引用
	MyVector& operator=(const MyVector& g) { 
		// 1-先判断是不是自己, 防止  出现   v = v;
		if (this == &g) {
			return *this;
		}
		// 2-释放原先对象的内存
		delete[] this->vecPtr;

		this->nowSize = g.nowSize; // 传入的对象,的私有成员,可以在类中的函数被访问到
		this->maxSize = g.maxSize;

		this->vecPtr = new int[g.maxSize];
		// 3-拷贝多少个字节过来 -> 要用到  sizeof
		memcpy(this->vecPtr, g.vecPtr, nowSize * sizeof(int));
		// 4-返回 *this
		return *this;
	}
};

二:赋值函数:

1-定义方式
  • 1-先判断是不是自己, 防止 出现 v = v;
if (this == &g) { return *this; }
  • 2-释放原先对象的内存
delete[] this->vecPtr;
  • 3-拷贝多少个字节过来 -> 要用到 sizeof 以及 string.h 库中的 memcpy(目的地址,源地址, 字节数)
memcpy(this->vecPtr, g.vecPtr, nowSize * sizeof(int));
  • 4-返回 *this
return *this;
2-什么时候调用?

MyVector v1, v2; // 调用构造函数

MyVector v3 = v1; // 调用拷贝构造函数

v2 = v1; // 调用赋值函数

3-函数头:
  • 返回值为 本类对象的引用
  • 参数为 本类对象的常引用

**MyVector& operator=(const MyVector& g) **

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值