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++中最常用的运算符。双目运算符有两个操作数,通常在运算符的左右两侧,在重载双目运算符时,在函数中应有两个参数。

重载单目运算符

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

相关推荐
caimouse2 小时前
reactos编码规范
c语言·开发语言
xieliyu.6 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
数智工坊7 小时前
机器人运动控制:采样、优化与学习三大流派深度对比与实战
android·学习·机器人
CryptoPP7 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链
ZC跨境爬虫7 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript
阳区欠8 小时前
【LangChain】LLM基础介绍
开发语言·python·langchain
Jinkxs8 小时前
Java 跨域14-Java 与区块链(Hyperledger)集成
java·开发语言·区块链
晨曦中的暮雨9 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
小小编程路10 小时前
Python 还有容器类型互转、进制转换、字符编码转换
开发语言·windows·python
Qt程序员10 小时前
Linux RCU 原理与应用
linux·c++·内核·linux内核·rcu