C++编程学习(第42天)

运算符重载

例1:通过函数来实现复数相加

cpp 复制代码
#include <iostream>
using namespace std;

class Complex
{
public:
	Complex() { real = 0; imag = 0; }
	Complex(double r, double i) { real = r; imag = i; }
	Complex complex_add(Complex& c2);
	void display();
private:
	double real, imag;
};

Complex Complex::complex_add(Complex& c2)
{
	Complex c;
	c.real = real + c2.real;
	c.imag = imag + c2.imag;
	return c;
}

void Complex::display()
{
	cout << "(" << real << "," << imag << "i)" << endl;
}

int main()
{
	Complex c1(3, 4), c2(5, -10), c3;
	c3 = c1.complex_add(c2);
	cout << "c1 = ";
	c1.display();
	cout << "c2 = ";
	c2.display();
	cout << "c1 + c2 = ";
	c3.display();
	return 0;
}
运算符重载的方法

运算符重载的方法是定义一个重载运算符的函数,使指定的运算符不仅能实现原有的功能,而且能实现在函数中指定的新功能。在使用被重载的运算符时,系统就自动调用该函数,以实现相应的功能,运算符重载实质上是函数的重载。

重载运算符的函数一般格式如下

函数类型 operator 运算符名称(形参表)

{对运算符的重载处理}

其中operator是关键字,是专门用于定义重载运算符的函数的,运算符名称就是C++已有的运算符,函数名是由operator和运算符组成,如operator+为函数名,意思是对运算符+重载的函数。

例2:对运算符+实行重载,使之能用于两个复数相加。

cpp 复制代码
#include <iostream>
using namespace std;

class Complex
{
public:
	Complex() { real = 0; imag = 0; }
	Complex(double r, double i) { real = r; imag = i; }
	Complex operator + (Complex & c2);
	void display();
private:
	double real, imag;
};

Complex Complex::operator+(Complex& c2)
{
	Complex c;
	c.real = real + c2.real;
	c.imag = imag + c2.imag;
	return c;
}

void Complex::display()
{
	cout << "(" << real << "," << imag << "i)" << endl;
}

int main()
{
	Complex c1(3, 4), c2(5, -10), c3;
	c3 = c1 + c2;
	cout << "c1 = ";
	c1.display();
	cout << "c2 = ";
	c2.display();
	cout << "c1 + c2 = ";
	c3.display();
	return 0;
}
重载运算符的规则

1、C++不允许用户自己定义新的的运算符,只能对已有的C++运算符进行重载。

2、C++不能进行重载的运算符有:.、*、::、sizeof和?:

3、重载不能改变运算符运算对象的个数。

4、重载不能改变运算符的优先级别

5、重载不能改变运算符的结合性。

6、重载运算符的函数不能有默认参数。

7、重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象

8、用于类对象的运算符一般必须重载,但有两个例外,运算符=和&不必用户重载。

9、从理论上说,可以将一个运算符重载为执行任意的操作,但为了更好理解程序,应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。

运算符重载函数作为类成员函数和友元函数

对运算符重载的函数有两种处理方式:

1、把运算符重载的函数作为类的成员函数;

2、运算符重载的函数不是类的成员函数,在类中把它声明为友元函数。

如果将运算符函数作为成员函数,它可以通过this指针自由地访问本类的数据成员,因此可以少些一个函数的参数,但必须要求运算表达式中第一个参数是一个类对象,而且与运算符重载函数的类型相同。

将双目运算符重载为友元函数时,由于友元函数不是该类的成员函数,因此在函数的形参表列中必须有两个参数,不能省略,形参顺序任意。

重载双目运算符

双目运算符是C++中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧,在重载双目运算符时,在函数中应有两个参数。

重载单目运算符

单目运算符只有一个操作数,重载单目运算符的方法与 重载双目运算符的方法时类似的。

相关推荐
q***78783 分钟前
Spring学习——新建module模块
java·学习·spring
u***u68512 分钟前
PHP最佳实践
开发语言·php
是店小二呀17 分钟前
使用Rust构建一个完整的DeepSeekWeb聊天应用
开发语言·后端·rust
Bin二叉42 分钟前
南京大学cpp复习——面向对象第一部分(构造函数,拷贝构造函数,析构函数,移动构造函数,友元)
c++·笔记·学习
大锦终1 小时前
【Linux】高级IO
linux·服务器·网络·c++
灵晔君1 小时前
C++标准模板库(STL)——list的使用
c++·list
xhyyvr1 小时前
解码大地的预警 —— VR地震起因及先兆学习系统
学习·vr·vr公共安全·vr公共安全体验馆·vr地震·vr地震起因先兆·vr地震模拟平台
努力学习的小廉1 小时前
我爱学算法之—— 字符串
c++·算法
算法如诗1 小时前
**MATLAB R2025a** 环境下,基于 **双向时间卷积网络(BITCN)+ 双向长短期记忆网络(BiLSTM)** 的多特征分类预测完整实现
开发语言·网络·matlab
k09331 小时前
在组件外(.js文件)中使用pinia的方法2--在http.js中使用pinia
开发语言·javascript·http