《新标准C++程序设计》4.1(C++学习笔记12)

运算符重载的概念和原理

 

一、运算符重载的需求

C++预定义的“+、-、 * 、/、%、 ^ 、&、~、!、|、 = 、<< >>、!= ”等运算符,只能用于基本数据类型(整型、实型、字符型、逻辑型)的常量或变量进行运算,不能用于对象之间的运算。

在数学上,两个复数可以直接进行+、-等运算。但在C++中,直接将+或-用于复数对象是不允许的。有时会希望,让对象也能通过运算符进行运算。这样代码更简洁,容易理解。

 

二、运算符重载

运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多重的含义,使同一运算符作用于不同类型的数据时导致不同类型的行为。

运算符重载的目的是:扩展C++中提供的运算符的适用范围,使之能作用于对象。

同一个运算符,对不同类型的操作数,所发生的行为不同。

 

三、运算符重载的形式

运算符重载的实质是函数重载

可以重载为普通函数,也可以重载为成员函数

把含运算符的表达式转换成对运算符函数的调用。

把运算符的操作数转换成运算符函数的参数。

运算符被多次重载时,根据实参的类型决定调用哪个运算符函数。

运算符函数的格式

返回值类型 operator 运算符(形参表)
{
   ……
}

程序示例分析:

#include
using namespace std;
class Complex
{
public:
    double real, imag;
    Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) { }
    Complex operator-(const Complex& c);
};
Complex operator+(const Complex& a, const Complex& b)
{
    return Complex(a.real + b.real, a.imag + b.imag);      //返回一个临时对象
}
Complex Complex::operator-(const Complex& c)
{
    return Complex(real - c.real, imag - c.imag);          //返回一个临时对象
}
int main()
{
    Complex a(4, 4), b(1, 1), c;
    c = a + b;                                             //等价于c=operator+(a,b);
    cout << c.real << "," << c.imag << endl;
    cout << (a - b).real << "," << (a - b).imag << endl;   //a-b等价于a.operator-(b)
    return 0;
}

输出结果:

5,5
3,3

Tips:

重载为成员函数时,参数个数为运算符目数减一。

重载为普通函数时,参数个数为运算符目数。

“类名(构造函数实参表)”这种写法表示生成一个临时对象。

你可能感兴趣的:(《新标准C++程序设计》4.1(C++学习笔记12))