复制运算符函数

题目:如下CMyString的声明,请为该类型添加赋值运算符函数。

#pragma once
#include <string.h>
class CMyString
{
public:
	CMyString(char*);
	CMyString(const CMyString&);
	~CMyString(void);
	CMyString& operator=(CMyString& str);
private:
	char* m_pData;
};
需要考虑以前四点:
1:是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例的引用。只有返回一个引用,才允许连续赋值操作。例如,有3个CMyString类型的对象:str1,str2,str3,可以进行str1=str2=str3,如果返回值是void,如果执行str1=str2=str3,则不能通过编译。
2:是否把传入的参数声明为常量引用。如果传入的参数不是引用而是实例,那么就会从形参道实参会调用一次复制构造函数。并且这样在赋值运算函数内不会改变传入的实例。
3:是否释放了实例自身占有的内存。如果我们忘记在分配内存前释放之前占有的空间,程序将会出现内存泄露。
4:是否判断传入的参数和实例是不是同一个实例。如果没有判断,就会出现严重的问题。当传入的实例和*this是同一个内存,那么一旦释放了实例的内存,传入的参数也释放了内存,因此就再也找不到需要赋值的内容了。

初级的程序:

更安全的程序:

CMyString& CMyString::operator=(const CMyString& str)
{
	if(this != &str)
	{
		CMyString strTemp(str); //临时变量 分配空间
		char* pTemp = strTemp.m_pData;
		strTemp.m_pData = m_pData;
		m_pData = pTemp;
	}
	return *this;
};
//函数结束后 释放strTemp.m_pData占有的空间,也就是之前this指向的地址的空间


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个Array类的定义: ```cpp class Array { private: int *data; int size; public: // 构造函数 Array(int s); // 复制构造函数 Array(const Array& arr); // 析构函数 ~Array(); // 赋值运算符函数 Array& operator=(const Array& arr); // 下标运算符函数 int& operator[](int index); // 获取数组大小 int getSize() const; }; ``` 在类体外为其添加构造函数复制构造函数、析构函数、赋值运算符函数、下标运算符函数的实现: ```cpp // 构造函数 Array::Array(int s) { size = s; data = new int[size]; } // 复制构造函数 Array::Array(const Array& arr) { size = arr.size; data = new int[size]; for (int i = 0; i < size; i++) { data[i] = arr.data[i]; } } // 析构函数 Array::~Array() { delete[] data; } // 赋值运算符函数 Array& Array::operator=(const Array& arr) { if (this != &arr) { delete[] data; size = arr.size; data = new int[size]; for (int i = 0; i < size; i++) { data[i] = arr.data[i]; } } return *this; } // 下标运算符函数 int& Array::operator[](int index) { if (index < 0 || index >= size) { throw out_of_range("Index out of range"); } return data[index]; } // 获取数组大小 int Array::getSize() const { return size; } ``` 注意,这里实现的赋值运算符函数使用了自赋值检查。如果没有自赋值检查,当我们对同一个对象进行连续赋值时,就会出现问题。比如: ```cpp Array a(10); a[0] = 1; a[1] = 2; a = a; // 自赋值,如果没有自赋值检查,就会出现问题 ``` 最后要注意的是,这里我们在下标运算符函数中使用了 `throw` 语句,抛出了一个 `out_of_range` 异常。这是因为如果访问超出数组下标范围的元素,就会发生越界访问,导致程序崩溃。因此,我们在下标运算符函数中加入了异常处理机制,保证程序的健壮性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值