重载运算符
一重载运算符的限制
在我们定义了类之后,出现了一些新的数据类型,因此我们要根据数据类型的不同要重新编写我们的运算符,在c++中大部分的预定义的运算符都可以被重载,但以下运算符不能被重载 "." ".*" "::" "?" "sizeof"。
重载运算符函数可以对运算符做出新的解释,即定义用户所需要的各种操作。但运算符重载后,原有的基本语句不变,包括
1 不改变运算符的优先级
2 不改变运算符的结合性
3 不改变运算符所需要的操作数
要注意的是不能创新的运算符,只有系统预定义的运算符才能被重载。
二重载运算符的语法形式
运算符函数是一种特殊的成员函数或友元函数。成员函数的语句格式为:
类型 类名::operator op(参数表)
{
//相对于该类定义的操作
}
类型是函数的返回类型。“类名”是要重载该运算符的类。“op”表示要重载的运算符“参数表”列出该运算符所需要的操作数
重载运算符的函数不能有默认参数.
重载的运算符必须和用户定义的自定义类型一起使用,其参数至少应有一个是类对象(或类对象的引用)
防止用户修改用于标准数据类型的运算符
用于类对象的运算符一般必须重载,但有两个例外“=”和“&”不必重载
"=”,系统有默认的重载函数,就是逐个复制成员,除非有必要(像动态分配内存的内容)就不必重载
"&",它能返回类对象在内存中的起始地址
要按习惯重载,虽然可以但还是不要把“+”重载成 减法,否则有违重载的初衷
运算符重载函数可以是类成员函数(如“+”左边必须是类),类友元函数(需要访问类私有成员时使用很方便),普通函数(访问类私有成员时不太方便)
重载运算符有两种方式
一种是成员函数重载运算符,另一种是友元函数重载运算符。
重载为类的成员函数
返回类型(类名::)operator运算符(形参表){函数体;}
重载为类的友元函数
friend 函数类型 operator 运算符(形参表){函数体;}
通过友元关系可以实现不同类或对象的成员函数之间,类的成员函数与一般函数之间进行数据共享机制。我们先在类中声明这几个重载函数为该类的友元,这里要注意此时重载函数的参数有两个而不是一个,友元函数需要两个参数分别调用在主函数往里面传递的值,友元函数最大的好处就是能够调用类中的私有数据成员,还能保证类的封装性。所以我认为一般用友元函数重载运算符要比用成员函数重载要好用。
- #include <iostream>
- using namespace std;
- class Coordinate
- {
- public:
- Coordinate(int x, int y)
- {
- m_iX = x;
- m_iY = y;
- }
- Coordinate &operator--()
- {
- this->m_iX--;
- this->m_iY--;
- return *this;
- }
- Coordinate operator--(int)
- {
- Coordinate coor(*this);
- coor.m_iX=this->m_iX--;
- coor.m_iY=this->m_iY--;
- return coor;
- }
- Coordinate operator+(Coordinate &c)
- {
- Coordinate temp(0,0);
- temp.m_iX=this->m_iX+c.m_iX;
- temp.m_iY=this->m_iY+c.m_iY;
- return temp;
- }
- public:
- int m_iX;
- int m_iY;
- };
- int main(void)
- {
- Coordinate coor1(1, 3);
- Coordinate coor2(2, 4);
- Coordinate coor3(0, 0);
- coor1--;
- --coor2;
- coor3 = coor1 + coor2;
- cout << coor3.m_iX << endl;
- cout << coor3.m_iY << endl;
- return 0;
- }