C++:运算符的重载

本文详细介绍了C++中的运算符重载,包括赋值运算符的深复制、流插入和提取运算符的重载、自增/自减运算符的前后置重载,以及类型强制转换运算符的重载。强调了运算符重载的注意事项,如保持运算符的常规含义和避免重载某些特定运算符。
摘要由CSDN通过智能技术生成

运算符重载

运算符重载

  • 对已有的运算符赋予多重的含义
  • 使同一运算符作用于不同类型的数据时有不同类型的行为

目的:

  • 扩展cpp中提供的运算符的适用范围, 以用于类所表示的抽象数据类型

运算符重载的实质是函数重载,参数个数为运算符目数

返回值类型 operator 运算符(形参表)
{
   
	…… 
}

在程序编译时:

  • 把含运算符的表达式 -> 对运算符函数的调用
  • 把运算符的操作数 -> 运算符函数的参数
  • 运算符多次重载时,根据实参类型决定调用哪个运算符函数
  • 运算符可以被重载为普通函数,也可以被重载为类的成员函数

例如复数相加:

重载为普通函数,参数个数为运算符目数

Complex operator+(const Complex &a, const Complex &b)
{
   
	return Complex(a.real + b.real, a.imag + b.imag)
}

运算符重载为成员函数,参数个数为运算符目数减一

Complex operator+(const Complex &operand2);
// x = y + z
// 等价于 x = y.operator+(z)

赋值运算符重载

赋值运算符

赋值运算符两边的类型可以不匹配,但需要重载赋值运算符 =

  • 把一个 int 类型变量 赋值给一个 Complex对象
  • 把一个 char* 类型的字符串赋值给一个 字符串对象

注意:赋值运算符 = 只能重载为成员函数

例子:字符串赋值

class String
{
   
private:
	char *str;//指向动态分配的存储空间
public:
	String() :str(NULL) {
   }
	const char *get_str() {
    return str; }
	char* operator=(const char *str);
	~String();
};

char* String::operator=(const char *s)
{
   //重载= -> obj="Hello"能够成立。调用时,把"Hello"的首地址传递进来
	if (str)
	{
   
		delete[] str;
	}
	if (s)
	{
   
		str = new char[strlen(s) + 1];//+1是为了存放“/0”
		strcpy(str, s);
	}
	else
	{
   
		str = NULL;
	}
	return str;
}

String::~String()
{
   
	if (str)
	{
   
		delete[] str;
	}
}

赋值运算符重载的目的:

  • 可以使用其他类型变量或常量给对象赋值
  • 解决浅拷贝的问题

浅复制与深复制

浅复制是一种逐字节的复制。在复制内容包含指针时会产生问题。

MyString S1, S2;
S1 = "this";
S2 = "that";
S2 = S1;

这样一个简单的程序会导致S1和S2的char * 变量指向同一块内存,会造成内存垃圾,以及重复delete的隐患。

ZIvBJU.png

利用赋值运算符重载可以实现深复制:将一个对象中指针变量指向的内容,复制到另一个对象中指针成员对象指向的地方。

String& operator=(const String &s)
{
   
	if (str == s.str)  // 针对自身赋值的情况
	{
   
		return *this;
	}
	if (str)
	{
   
		delete[] str;
	}
	if (s.str)
	{
   
		str = new char[strlen(s.str
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值