基本操作符重载
- 基本操作符重载
- reference
基本操作符重载
操作符重载指的是将 C++ 提供的操作符进行重新定义,使之满足我们所需要的一些功能。
在 C++ 中可以重载的操作符有:
+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |=
<< >> <<= >>= == != <= >= && || ++ -- , ->* -> () []
new new[] delete delete[]
上述操作符中,[ ]操作符是下标操作符,( )操作符是函数调用操作符。自增自减操作符的前置和后置形式都可以重载。长度运算符sizeof、条件运算符:?、成员选择符.、对象选择符.*和域解析操作符::不能被重载。
complex operator+(const complex & A)const;
为了介绍基本操作符的重载,我们先来看一个操作符重载的示例。
#include <iostream>
using namespace std;class complex
{
public:complex();complex(double a);complex(double a, double b);complex operator+(const complex & A)const;complex operator-(const complex & A)const;complex operator*(const complex & A)const;complex operator/(const complex & A)const;void display()const;
private:double real; //复数的实部double imag; //复数的虚部
};complex::complex()
{real = 0.0;imag = 0.0;
}complex::complex(double a)
{real = a;imag = 0.0;
}complex::complex(double a, double b)
{real = a;imag = b;
}//打印复数
void complex::display()const
{cout<<real<<" + "<<imag<<" i ";
}//重载加法操作符
complex complex::operator+(const complex & A)const
{complex B;B.real = real + A.real;B.imag = imag + A.imag;return B;
}//重载减法操作符
complex complex::operator-(const complex & A)const
{complex B;B.real = real - A.real;B.imag = imag - A.imag;return B;
}//重载乘法操作符
complex complex::operator*(const complex & A)const
{complex B;B.real = real * A.real - imag * A.imag;B.imag = imag * A.real + real * A.imag;return B;
}//重载除法操作符
complex complex::operator/(const complex & A)const
{complex B;double square = A.real * A.real + A.imag * A.imag;B.real = (real * A.real + imag * A.imag)/square;B.imag = (imag * A.real - real * A.imag)/square;return B;
}int main()
{complex c1(4.3, -5.8);complex c2(8.4, 6.7);complex c3;//复数的加法c3 = c1 + c2;cout<<"c1 + c2 = ";c3.display();cout<<endl;//复数的减法c3 = c1 - c2;cout<<"c1 - c2 = ";c3.display();cout<<endl;//复数的乘法c3 = c1 * c2;cout<<"c1 * c2 = ";c3.display();cout<<endl;//复数的除法c3 = c1 / c2;cout<<"c1 / c2 = ";c3.display();cout<<endl;return 0;
}

在这个例子中,我们定义了一个复数类,一个复数包含实部和虚部两部分,我们分别用 real 和 imag 来表示复数的实部和虚部,并将这两个变量作为复数类的成员变量,并设置为 private 属性。在复数类中,我们定义了三个构造函数用于初始化复数类的对象。之后声明了四个操作符重载函数,分别重载加减乘除四种操作符。最后定义了一个打印复数的 display() 函数。
为了避免大家不熟悉复数的四则运算,在这里将其一一列出,以助于大家对例 1 的理解。
在例 1 中,我们是将操作符重载函数声明为成员函数,首先需要关注的是操作符重载函数的声明。例如,重载加法操作符时,其函数声明为:
complex operator+(const complex & A)const;
两个复数相加,函数返回值为 complex 类对象,仍然为一个复数。复数相加需要两个复数进行运算,调用函数的类对象本身就是一个复数,因此还需要另外一个复数作为参数。在该函数声明中,函数的参数为复数类对象的引用并加上了 const 关键字,确保在函数中不会修改该对象的引用。
我们再来看一下加法操作符重载函数的类外定义(第 45 行)。在函数体中,我们先定义了一个复数类对象 B,之后按照复数的加法运算规则将计算结果赋给 B 的 real 和 imag 成员变量。由于系统会给类生成一个默认的拷贝构造函数,因此采用传值的形式将计算结果返回没有问题。
调用操作符重载函数的语法和调用普通成员函数的语法相同,例如我们定义三个 complex 类的对象 A、B 和 C,调用的语法是C=A.operator+(B);,由于 operator 关键字的作用,operator+() 这个成员函数也可以通过我们非常熟知的方法调用:C = A + B;,采用这种方式调用 operator+() 这个操作符重载函数,意义非常明了,在本例中我们也都是按照这种方式调用的。
我们知道,进行加法运算时需要两个操作数,也即需要两个复数对象,但是在声明操作符重载函数时,complex operator+(const complex & A)const;确只有一个函数参数。这一点无需奇怪,我们看其调用方式就明白了,比较规范的调用方法是C = A.operator+ ( B );,此处是 A 对象调用该函数,并且函数参数是另一个复数类对象。如此一来,两个操作数分别是 A 和 B。加法操作符二元操作符,但是将其作为成员函数声明时则只需要有一个参数即可,如果重载的操作符是一元操作符,并将其作为类的成员函数,则不需要参数。
class test
{
public:test operator!();
};
例 2 中重载的是一元操作符“!”(非),因为是作为成员函数重载的,因此不需要参数
reference
微学苑 C++基本操作符重载










![面试06,[长亮科技]()(offer)、[荔枝]()FM(在确定部门和薪资)、[涂鸦智能]()(第一轮电话面半小时,待后续)、华资软件(HR面)、[广州速游]()(已挂)。至于公司怎么样不加以言论。](https://img-blog.csdnimg.cn/img_convert/0a8f4edbf8a2587426f02790e8085e9c.png)







