C++运算符重载
运算符重载概念:即给原有运算符赋予新功能。
比如,c++中的以下操作便是用到了重载运算符:
#include<string>
#include<iostream>
using namespace std;
int main(void)
{
string str1("hello");
string str2("world");
string str3;
str3 = str1 + ' ' + str2;//这里的“+”和“=”就被重载了,只不过封装起来了我们看不到而已(我们的+号只有1+1=2这种数值计算的功能)
cout << str3 << endl;//这里的第一个“<<”便被重载了
system("pause");
return 0;
}
运算符重载的本质:函数重载。
运算符重载目的:
- 用操作整数的各种运算方法,让运算符重载让类也具有整数的各种简单运算
- 我们对类产生的对象进行非常方便的运算操作,让代码、简洁明了,操作方便
关键字:operator
注意:在学习运算符重载之前,建议先补充this指针的相关知识点
一元运算符重载
一元运算符即只有一个操作数参与运算。例如:-(负号,不是减号)、++(自增运算符)等等。
以下展示两个较为典型的例子。
这里以“-”负号为例:
“-”的重载,有友元函数重载(友元函数作为全局函数对其进行重载)和成员函数重载(定义一个类的成员函数)两种。
成员函数重载:
#include<iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x, int y);//构造函数
Coordinate& operator-(); //对-进行重载
void printInfo();//打印函数
private:
int m_iX;
int m_iY;
};
Coordinate::Coordinate(int x, int y)
{
m_iX = x;
m_iY = y;
}
Coordinate& Coordinate::operator-()//重载函数的实现
{
m_iX = -m_iX;
m_iY = -m_iY;
return *this;//普通的成员函数有隐性的this指针作为参数 ,这里的this指针就是“-”的操作数
}
void Coordinate::printInfo()
{
cout << "(" << m_iX << "," << m_iY << ")";
}
int main(void)
{
Coordinate coor(2, 3);
-coor; //等价于调用了coor.operator-()
coor.printInfo();
system("pause");
return 0;
}
友元函数的重载:
#include<iostream>
using namespace std;
class Coordinate
{
friend Coordinate& operator-(Coordinate &coor);
public:
Coordinate(int x, int y);
void printInfo();
private:
int m_iX;
int m_iY;
};
Coordinate::Coordinate(int x, int y)
{
m_iX = x;
m_iY = y;
}
void Coordinate::printInfo()
{
cout << "(" << m_iX << "," << m_iY << ")";
}
Coordinate& operator-(Coordinate &coor)//对-进行重载
{
coor.m_iX = -coor.m_iX;
coor.m_iY = -coor.m_iY;
return coor;
}
int main(void)
{
Coordinate coor(2, 3);
-coor;//等价于operator-(coor)
coor.printInfo();
system("pause");
return 0;
}
这里以“++”为例:
前置++运算符的重载:
前置++重载和“-”负号重载类似,这里只贴出关键部分代码:
Coordinate& Coordinate::operator++()//前置++的重载
{
m_iX++;
m_iY++;
return *this;
}
后置++运算符的重载:
#include<iostream>
using namespace std;
class Coordinate
{
public:
Coordinate(int x, int y);
Coordinate operator++(int);//这里的int是一个标志性参数,用来告诉编译器这里是一个后置++的重载
void printInfo(); // 注意:没有&
private:
int m_iX;
int m_iY;
};
Coordinate::Coordinate(int x, int y)
{
m_iX = x;
m_iY = y;
}
Coordinate Coordinate::operator++(int)//后置++的重载
{
Coordinate old(*this);//由于类中数据成员不涉及指针,这里的拷贝用的是默认的拷贝构造函数(即浅拷贝)
m_iX++;
m_iY++;
return old;//返回后置++之前的对象的值
}
void Coordinate::printInfo()
{
cout << "(" << m_iX << "," << m_iY << ")";
}
int main(void)
{
Coordinate coor(2, 3);
(coor++).printInfo();//后置++操作时,仍返回原值
coor.printInfo();//进行后置++操作之后,coor的值就改变了
system("pause");
return 0;
}
二元运算符的重载:https://blog.csdn.net/weixin_43217963/article/details/88711077