1. 来源
什么是c++ 中的运算符?C++中的运算符是用于执行各种操作的特殊符号。下面是一些常见的C++运算符:
-
算术运算符:用于执行基本的数学运算,例如加法(+),减法(-),乘法(*),除法(/),取模(%)等。
-
关系运算符:用于比较两个值之间的关系,例如等于(==),不等于(!=),大于(>),小于(<),大于等于(>=),小于等于(<=)。
-
逻辑运算符:用于组合和操作布尔表达式,例如逻辑与(&&),逻辑或(||),逻辑非(!)。
-
位运算符:用于对整数在二进制位级别进行操作,例如按位与(&),按位或(|),按位异或(^),左移位(<<),右移位(>>)。
-
赋值运算符:用于将一个值赋给变量,例如简单赋值(=),加等赋值(+=),减等赋值(-=)等。
-
条件运算符:也称为三元运算符,在条件满足时返回一个值,语法为条件 ? 值1 : 值2。如果条件成立,则返回值1;否则返回值2。
-
自增自减运算符:用于增加或减少变量的值,包括前缀自增(++变量),后缀自增(变量++),前缀自减(–变量),后缀自减(变量–)。
2. 简介
运算符重载(Operator Overloading)是指通过定义特定的函数来重新定义已有运算符的行为。运算符重载允许在开发者自定义的类型上使用类似于内置类型的运算符,使得自定义类型能够以更直观和自然的方式进行运算操作。
3. 特点
- 重载后的运算符可以像使用内置运算符一样使用
- 通过函数重载实现:运算符重载是通过定义特定的成员函数或非成员函数来实现的,这些函数具有特定的命名规则和参数列表,使得编译器能够在正确的上下文中调用它们
- 不能改变运算符的优先级和结合性:运算符重载只能改变运算符的操作数类型和操作行为,不能改变运算符的优先级和结合性。
4. 定义方式
定义运算符重载有两种方式,成员函数定义和全局函数定义。
代码:
#include <iostream>
class Vector {
public:
int x;
int y;
Vector(int xVal, int yVal) : x(xVal), y(yVal) {}
// 成员函数定义运算符重载
// Vector operator+(const Vector& other) const {
// return Vector(x + other.x, y + other.y);
// }
// 运算符重载:输出向量
friend std::ostream& operator<<(std::ostream& os, const Vector& v) {
os << "(" << v.x << ", " << v.y << ")";
return os;
}
};
// 全局函数定义运算符重载
Vector operator+(const Vector& other0,const Vector& other1) {
return Vector(other0.x + other1.x, other0.x + other1.y);
}
int main() {
Vector v1(1, 2);
Vector v2(3, 4);
Vector result = v1 + v2; // 使用运算符+
std::cout << "Result: " << result << std::endl; // 使用运算符<<
return 0;
}
4.1 成员函数定义重载运算符 + (operator+):
- 运算符右边的对象就是重载运算符函数的参数
v1 + v2
就会调用operator+
函数,相当于v1.operator+(v2)
4.2 全局函数定义重载运算符 + (operator+):
- 运算符左右两边的对象就是重载运算符函数的参数
v1 + v2
就会调用operator+
函数,相当于operator+(v1,v2)
4.3 tips
既然可以成员函数的方式了,为什么还需要有全局函数这种方式?
成员函数定义的方式就是在类的范畴里面定义,只有不能在类的里面
定义运算符重载的时候,才需要使用全局函数的方式。一般这种情况出现在,项目使用到了别人已经写好的类,并且这个类的源码无法修改。