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

重载单目运算符

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

相关推荐
咬_咬4 小时前
C++仿muduo库高并发服务器项目:Channel模块
linux·c++·channel·1024程序员节·muduo·高并发服务器
yong99904 小时前
基于MATLAB的内容图像检索实现
开发语言·matlab
歪歪1004 小时前
在C#中详细介绍一下Visual Studio中如何使用数据可视化工具
开发语言·前端·c#·visual studio code·visual studio·1024程序员节
凉虾皮4 小时前
2024包河初中组
学习·算法·1024程序员节
jdlxx_dongfangxing4 小时前
C++ STL 容器与算法详解
开发语言·c++·1024程序员节
明道源码4 小时前
Kotlin 控制流、函数、Lambda、高阶函数
android·开发语言·kotlin
橙子199110164 小时前
在 Kotlin 中,ViewModel 的获取
开发语言·vue.js·kotlin
脚踏实地的大梦想家5 小时前
【Go】P8 Go 语言核心数据结构:深入解析切片 (Slice)
开发语言·数据结构·golang
hweiyu005 小时前
Gradle 构建脚本迁移:从 Groovy DSL 到 Kotlin DSL,语法与技巧对比
开发语言·kotlin·gradle