运算符重载
同类:对象1 运算符 对象2——c1 + c2
调用运算符重载方法计算
基本使用
#include <iostream>class ComplexNumber {
private:double real;double imaginary;public:ComplexNumber(double r, double i) : real(r), imaginary(i) {}// 运算符重载,实现复数对象的相加操作ComplexNumber operator+(const ComplexNumber& other) {double newReal = real + other.real;double newImaginary = imaginary + other.imaginary;return ComplexNumber(newReal, newImaginary);}// 输出复数对象的内容void display() {std::cout << real << " + " << imaginary << "i" << std::endl;}
};int main() {ComplexNumber num1(3.0, 2.0);ComplexNumber num2(1.5, 4.5);ComplexNumber sum = num1 + num2; // 使用运算符重载执行相加操作std::cout << "Sum of complex numbers: ";sum.display();return 0;
}
流式输出的本质
运算符重载
<<的运算符重载函数
类似于Java类的tostring方法
ostream& operator<<(ostream& out,Test &t){out<<t.v<<endl;return out;
}
可以被重载的运算符
在C++中,可以通过运算符重载来改变内置数据类型或自定义类对象之间的操作行为。以下是一些可以被重载的运算符:
-
算术运算符:可以重载加法、减法、乘法、除法等算术运算符。
+
:重载为对象相加。-
:重载为对象相减。*
:重载为对象相乘。/
:重载为对象相除。%
:重载为对象相模除。
-
关系运算符:可以重载关系运算符,如等于、不等于、大于、小于等。
==
:重载为对象相等比较。!=
:重载为对象不等比较。<
:重载为对象小于比较。>
:重载为对象大于比较。<=
:重载为对象小于等于比较。>=
:重载为对象大于等于比较。
-
赋值运算符:可以重载赋值运算符(
=
),使其能够用于自定义类对象。 -
自增和自减运算符:可以重载前缀(
++
和--
)和后缀(++
和--
)自增和自减运算符。 -
位运算符:可以重载按位与(
&
)、按位或(|
)、按位异或(^
)等位运算符。 -
逻辑运算符:可以重载逻辑与(
&&
)、逻辑或(||
)等逻辑运算符。 -
下标运算符:可以重载方括号运算符
[]
,以便类对象可以像数组一样使用。 -
函数调用运算符:可以重载圆括号运算符
()
,使对象可以像函数一样被调用。 -
成员访问运算符:可以重载成员访问运算符(
->
)和成员选择运算符(.
),以改变类对象的成员访问行为。 -
类型转换运算符:可以重载类型转换运算符,例如将对象转换为其他类型。
-
流插入和流提取运算符:可以重载
<<
和>>
运算符,以支持自定义对象的输入和输出。 -
新的和删除的运算符:可以重载
new
和delete
运算符,以自定义内存管理行为。
示例项目:
计算 平面坐标两点间的距离。
1),要求使用操作符重载的方法 (重载 “-” 算术运算符)
#include <iostream>
#include <cmath> // 包含 sqrt 函数的头文件class CPerson {
private:double x;double y;public:CPerson(double xVal, double yVal) : x(xVal), y(yVal) {}// 计算与另一个对象的距离double operator-(const CPerson& other) const {return sqrt((this->x - other.x) * (this->x - other.x) + (this->y - other.y) * (this->y - other.y));}
};int main() {CPerson person1(1.0, 2.0);CPerson person2(4.0, 6.0);double distance = person1 - person2; // 使用重载的减法运算符计算距离std::cout << "Distance between persons: " << distance << std::endl;return 0;
}