C++笔记之运算符重载详解

本文详细介绍了C++中的运算符重载,包括其本质、规则限制、重载形式,如作为类成员函数和友元函数的重载,并通过实例解释了不同运算符的重载方式,如双目、单目以及下标运算符的重载。同时讨论了何时选择成员函数和友元函数进行运算符重载。
摘要由CSDN通过智能技术生成

一.运算符重载简介

1.运算符重载实质

(1) 对已有的运算符赋予多重含义
(2) 必要性:C++预定义的运算符运算对象只能是基本数据类型,而不适用于用户自定义类型(如 类)
(3) 实现机制:

  • 将指定的运算符表达式转化为对运算符函数的调用,运算对象转化运算符函数的实参
  • 编译系统对重载运算符的选择,遵循函数重载的选择原则。
2.规则和限制

(1) 可以重载的运算符:
Alt
上述运算符中,[ ] 是下标运算符,()是函数调用运算符,++和 – 是自增自减运算符包括前置后置形式。
另外,有4个运算符不能重载,即 长度运算符 sizeof、条件运算符 ?:、成员选择符== . == 和域解析运算符== : : == 。
(2) 其他规则

  • 不改变原运算符的优先级和结合性。
  • 不能改变操作数个数。
  • 经重载的运算符,其操作数中至少应该有一个是自定义类型。

二.运算符的重载形式

1.重载为类成员函数

声明形式:

函数类型 operator 运算符(形参)
{
   
	函数体;
}

重载为友元函数时,参数个数=原操作数个数-1 (后置++、–除外)

(1) 双目运算符
如果重载运算符B 为类成员函数,使之能实现表示式oprd1 B oprd2, 其中oprd1位 A类对象,则 B 可被重载为 A 类的成员函数,形参类型是 oprd2 所属类型。经重载过,表达式 oprd1 B oprd2 相当于oprd1.operator B(oprd2)

举例说明:
重载 + 、+=,实现复数类complex 对象想相加。

#include<iostream>    
using namespace std;
class complex
{
   
public:
	complex(double real = 0.0, double image = 0.0)
	{
    this->real = real;this->image = image;}
	complex operator + (complex &c1); // 重载 + 为成员函数
	void operator += (complex &c1); //重载 +=
	int showComplex(); //输出复数
private:
	double real;
	double image;
};
complex complex::operator + (complex &c1) //重载 + 为成员函数的实现
{
   
  /*complex c;						//实现1:创建一个局部变量
	c.real = c1.real + real;
	c.image = c1.image + image;
	return c;  
	*/
	return complex(c1.real + real, c1.image + image); //实现2:创建临时变量,直接一句代码返回结果
}
void complex::operator+=(complex &c1)  //重载 += 
{
   
	real += c1.real;
	image += c1.image;
}
int complex::showComplex()
{
   
	cout << real;
	if (image > 0)
		cout << "+";
	if (image != 0)
		cout << image << "i" << endl;
	return 0;
}
int main()
{
   
	complex c1(1, 2), c2(-3, 4), c3;
	cout << "c1=";c1.showComplex();
	cout << "c2=";c2.showComplex();
	c3 = c1 + c2; //重载+ 的使用,两边都为complex对象
	cout << "c3=c1+c2=";c3.showComplex(); 
	c2 += c1;//重载+= 的使用,两边都为complex对象
	cout << "c2+=c1结果: ";c2.showComplex(); 
	return 0;
}

(2) 前置单目运算符
如果要重载 U 为类成员函数,使之能够实现表达式 U oprd,其中 oprd 为A类对象,则 U 可被重载为 A 类的成员函数,无形参。经重载后,表达式 U oprd 相当于 oprd.operator U()
(3) 后置单目运算符 ++和–
复习一下++ 、–

示例 解释
++i i自增1后再参与运算;i的值加1,++i的值也加1
i++ i参与运算后,i的值再加1;i的值加1,i++的值不变

如果要重载 ++或–为类成员函数,使之能够实现表达式 oprd++ 或 oprd-- ,其中 oprd 为A类对象,则 ++或-- 可被重载为 A 类的成员函数,且具有一个 int 类型形参。经重载后,表达式 oprd++ 相当于oprd.operator ++(0)

举例说明(1):
++ 实现Point类的坐标自增

#include<iostream>    
using namespace std;
class Point
{
   
private:
	int x, y;
public:
	Point(int x, int y)
	{
   
		this->x = x;
		this->y = y;
	}
	Point() {
   }
	Point & operator++();//重载前置单目运算符++为成员函数    ++i i加1,i++整体值加1
	Point operator
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值