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

简介:

本节书摘来自异步社区出版社《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&)返回流,为了高效这是通过引用来实现的。

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

相关文章
|
1天前
|
程序员 C++
C++程序中的运算符重载
C++程序中的运算符重载
8 2
|
4天前
|
测试技术 C++
C++|运算符重载(3)|日期类的计算
C++|运算符重载(3)|日期类的计算
|
4天前
|
C语言 C++
C++|运算符重载(2)|运算符重载的方法与规则
C++|运算符重载(2)|运算符重载的方法与规则
|
4天前
|
编译器 C++
C++|运算符重载(1)|为什么要进行运算符重载
C++|运算符重载(1)|为什么要进行运算符重载
|
6天前
|
编译器 C语言 C++
【C++从练气到飞升】05---运算符重载(二)
【C++从练气到飞升】05---运算符重载(二)
|
6天前
|
编译器 C++
【C++从练气到飞升】05---运算符重载(一)
【C++从练气到飞升】05---运算符重载(一)
|
6天前
|
存储 安全 算法
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】基于环形队列的多生产者多消费者模型(Linux系统下C++ 代码模拟实现)
27 0
|
6天前
|
算法 Linux 数据安全/隐私保护
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
【Linux | C++ 】生产者消费者模型(Linux系统下C++ 代码模拟实现)
13 0
|
6天前
|
编译器 C++
【C++】类与对象(运算符重载、const成员、取地址重载)
【C++】类与对象(运算符重载、const成员、取地址重载)
15 2
|
6天前
|
C++
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)