运算符重载是通过函数实现的,它本质上是函数重载。
运算符重载其实就是定义一个函数,在函数内实现想要的功能,当用到这个运算符时,编译器会自动调用这个函数。
#include <iostream>
using namespace std;
class complex{
public:
complex();
complex(double real, double imag);
public:
//声明运算符重载
complex operator+(const complex &A) const;
void display() const;
private:
double m_real; //实部
double m_imag; //虚部
};
complex::complex(): m_real(0.0), m_imag(0.0){ }
complex::complex(double real, double imag): m_real(real), m_imag(imag){ }
//实现运算符重载
complex complex::operator+(const complex &A) const{
complex B;
B.m_real = this->m_real + A.m_real;
B.m_imag = this->m_imag + A.m_imag;
return B;
}
void complex::display() const{
cout<<m_real<<" + "<<m_imag<<"i"<<endl;
}
int main(){
complex c1(4.3, 5.8);
complex c2(2.4, 3.7);
complex c3;
c3 = c1 + c2;
c3.display();
return 0;
}
可以将
operator运算符
名称这一部分看作函数名,例如operator+
。
在全局范围内重载运算符
运算符重载函数不仅可以作为类的成员函数,还可以作为全局函数。
运算符重载函数不是 complex 类的成员函数,但是却用到了 complex 类的 private 成员变量,所以必须在 complex 类中将该函数声明为友元函数。
#include <iostream>
using namespace std;
class complex{
public:
complex();
complex(double real, double imag);
public:
void display() const;
//声明为友元函数
friend complex operator+(const complex &A, const complex &B);
private:
double m_real;
double m_imag;
};
complex operator+(const complex &A, const complex &B);
complex::complex(): m_real(0.0), m_imag(0.0){ }
complex::complex(double real, double imag): m_real(real), m_imag(imag){ }
void complex::display() const{
cout<<m_real<<" + "<<m_imag<<"i"<<endl;
}
//在全局范围内重载+
complex operator+(const complex &A, const complex &B){
complex C;
C.m_real = A.m_real + B.m_real;
C.m_imag = A.m_imag + B.m_imag;
return C;
}
int main(){
complex c1(4.3, 5.8);
complex c2(2.4, 3.7);
complex c3;
c3 = c1 + c2;
c3.display();
return 0;
}
运算符重载时要遵循的规则
1.并不是所有的运算符都可以重载。长度运算符
sizeof
、条件运算符:?
、成员选择符.
和域解析运算符::
不能被重载。
2.重载不能改变运算符的优先级和结合性。
3.重载不能改变运算符的用法,原来有几个操作数、操作数在左边还是在右边,这些都不会改变。
4.运算符重载函数不能有默认的参数;否则就改变了运算符操作数的个数,这显然是错误的。
5.运算符重载函数既可以作为类的成员函数,也可以作为全局函数。
6.箭头运算符
->
、下标运算符[]
、函数调用运算符()
、赋值运算符=
只能以成员函数的形式重载。