1.运算符重载的概念
运算符重载指的是对已有的运算符重新定义新的运算规则,以适应不同的数据类型,当然重载之后之前的运算规则还是有的
2.为什么要运算符重载
对于基本数据类型,系统给出了运算符的操作规则,对于自定义数据类型来说,系统不知道该给出什么规则,运算符重载之后可以让运算符去适应不同的数据类型。
3.
可以被重载的运算符:
算术运算符:+、-、*、/、%、++、--
位操作运算符:&、|、~、^(位异或)、<<(左移)、>>(右移)
逻辑运算符:!、&&、||
比较运算符:<、>、>=、<=、==、!=
赋值运算符:=、+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=
其他运算符:[]、()、->、,、new、delete、new[]、delete[]
不被重载的运算符:
成员运算符 .、指针运算符 *、三目运算符 ? :、sizeof、作用域 ::
4.使用友元函数进行运算符重载(一般针对双目运算符)
#include <iostream>
using namespace std;
class Integer
{
private:
int value;
public:
Integer(int value):value(value){}
int get_value() const
{
return value;
}
// 友元函数的说明
friend Integer operator +(const Integer& i1,
const Integer& i2); // 双目
};
Integer operator +(const Integer& i1,
const Integer& i2)
{
return i1.value+i2.value;
}
int main()
{
Integer i1(1);
Integer i2(2);
Integer i3 = i1+i2;
cout << i3.get_value() << endl; // 3
return 0;
}
5.使用成员函数进行运算符重载(一般针对单目运算符)
相比于成员函数重载,成员函数重载第一个参数省略(其实使用了this指针进行代替)
#include <iostream>
using namespace std;
class Integer
{
private:
int value;
public:
Integer(int value):value(value){}
int get_value() const
{
return value;
}
// 成员函数运算符重载
Integer operator ++(); // 前置
Integer operator ++(int); // 后置
};
Integer Integer::operator ++()
{
return ++this->value;
}
Integer Integer::operator ++(int)
{
return this->value++;
}
int main()
{
Integer i1(1);
Integer i2(2);
cout << (i1++).get_value() << endl; // 1
cout << i1.get_value() << endl; // 2
cout << (++i2).get_value() << endl; // 3
return 0;
}
6.注意事项
- 运算符重载限制在C++已有的运算符范围内,不允许创建新的运算符。
- 运算符重载也是函数重载,运算符也是函数。
- 重载之后的运算符不能改变优先级和结合性。
- 重载之后的运算符不能改变操作数和语法结构。
- 运算符重载不能改变该运算符用于基本数据类型的含义,但是可以把基本数据类型与自定义类型一起运算,或者都使用自定义类型。
- 运算符重载是针对新类型数据的实际需要对原有运算符的功能进行扩充,因此重载之后的功能应该与原有的功能类似,避免没有目的地使用运算符重载。