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

重载单目运算符

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

相关推荐
段一凡-华北理工大学2 分钟前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe11 分钟前
C++——多态
开发语言·c++
遇乐的果园32 分钟前
前端学习笔记-vue加载渲染优化
前端·笔记·学习
越甲八千44 分钟前
STL stack为何没有迭代器
c++
心平气和量大福大1 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
遇乐的果园2 小时前
前端学习笔记-vue状态管理优化
前端·笔记·学习
从零开始的代码生活_2 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸2 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
可乐奶茶sky3 小时前
AI Agent 学习
人工智能·学习
GIS阵地3 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis