文章目录
引言:在模板中,我们定义了如下的sum函数
template<typename T>
T sum(T a,T b)
{
return a+b;
}
如果是正常的数据类型还可以运算,但是遇到对象相加了怎么办呢?
那么就引出我们今天所要讨论的内容——运算符重载
1、实现一个简单的运算符重载
1、运算符重载的作用
就像我们引言中所描述的一样,运算符重载的作用就是使得自定义类型和内置类型相同的逻辑
2、运行机制
主要是通过函数实现的。
【举个栗子】
int main()
{
int arr[] = { 1,22,32,45,67,46,69 };
int len = sizeof(arr) / sizeof(arr[0]);
for (CInt i = 0; i < len; i++)
{
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}
在上面的这个程序逻辑里面,CIn是一个对象,需要我们实现比较运算符的重载、++运算符的重载、中括号运算符重载等。
1、比较运算符的重载
因为运算符重载是通过函数实现的,所以在设计的时候我们就需要考虑函数的函数名、参数、返回值、函数体这四个元素。
函数名
:operator关键字加上要重载的运算符参数
:this指针接收的是左操作数,右操作数通过实参到形参传递的方式来获取返回值
:如果是比较的话就是一个bool表达式函数体
:就实现具体的逻辑过程
bool operator <(int rhs)
{
return value < rhs;
}
2、++运算符的重载
分析
因为++运算符的重载还分为前置加加和后置加加。所以为了区分,我们使用一个标志,将参数是int的设置成为后置加加,没有参数的表示前置加加。
然后再来分析常量中后置加加的逻辑,他是一个先赋值后加加的过程。所以对应到对象里面,我们就应该首先拿到临时量的备份,再加加。
实现如下:
const CInt operator++(int)
{
CInt tmp(*this);
value++;
return tmp;
}
前置加加就是先加加再赋值的过程,所以返回的是自加变量的本身,实现如下:
const CInt operator++()
{
value++;
return *this;
}
3、中括号运算符
分析
这是是一个双目运算符, arr[i]和i[arr]
表示的含义都是一样的,左操作数接收的是一个对象,右操作数接收形参int型的指针为第一个元素的地址。返回的是内存单元的本身,就是int&
实现如下
int& operator[](int* parr)
{
return parr[value];
}
2、总结
函数的实现分为两种方式
在类中
:this指针接收左操作数在类外
:左右操作数通过形参接收(并且一定要记住在类外实现的函数一定要在类中设置