《C和C++代码精粹》——1.12 运算符重载

    xiaoxiao2024-07-12  109

    本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第1章,第1.12节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    1.12 运算符重载

    C和C++代码精粹在C++中你可以重载运算符,例如,定义一个复数的数据类型如下:

    struct complex { double real, imag; };

    假如能使用中缀符号用于复数加法,那将会相当方便。如:

    complex c1,c2; … complex c3=c1+c2;

    当编译器遇到如c1+c2这样的表达式时,将查找下边两个函数中的一个(只须其中的一个存在):

    operator+(const complex&,const complex &); //全局函数 complex::operator+(const complex &); //成员函数

    关键字operator是函数名的一部分。为实现两个复数的加法可以将operator+定义为全局类型,如下:

    complex operator+(const complex &c1,const complex &c2) { complex r; r.real=c1.real+c2.real; r.imag=c1.imag+c2.imag; return r; }

    程序清单1.14 运算符+和运算符<<在复数中的应用

    #include <iostream> using namespace std; struct complex { double real, imag; complex(double = 0.0, double = 0.0); }; complex::complex(double r, double i) { real = r; imag = i; } inline ostream& operator<<(ostream &os, const complex &c) { os << '(' << c.real << ',' << c.imag << ')'; return os; } inline complex operator+(const complex &c1, const complex &c2) { return complex(c1.real+c2.real,c1.imag+c2.imag); }

    不允许重载系统中预定义的操作,例如,不允许重载两个整型数相加。因此,在重载操作中至少有一个操作数是用户自定义类型。

    流库“知道”怎样通过运算符重载来格式化各种系统预定义的数据类型。例如,ostream类中,cout是一个实例,它为所有的系统预定义的数据类型都重载了操作符<<,当编译器看到表达式:

    cout<<i;这里i是整型,它产生以下的函数运算:

    cout.operator<<(i); //ostream::operator<<(ostream&,int)这样可以正确地格式化数据。

    程序清单1.14表明如何通过重载用于复数的运算符<<来扩展标准流(输出在程序清单1.5中)。编译器将表达式

    cout<<c转换成下面的函数调用(在这里c是一个复数):

    operator << ( cout ,c)这将依次采用operator<<(ostream&,const complex&)将操作分解成格式化系统预定义类型的对象。这个函数也返回流,因此,可以在一个单独的语句中链接多个插入流。如,表达式

    cout<<c1<<c2变为

    operator<<(operator<<(cout,c1),c2)这要求operator<<(ostream&, const complex&)返回流,为了高效这是通过引用来实现的。

    本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

    相关资源:C和C 代码精粹
    最新回复(0)