博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中的链式操作
阅读量:6863 次
发布时间:2019-06-26

本文共 1560 字,大约阅读时间需要 5 分钟。

代码编译环境:Windows7 32bits+VS2012。


1.什么是链式操作

链式操作是利用运算符进行的连续运算(操作)。它的特点是在一条语句中出现两个或者两个以上相同的操作符,如连续的赋值操作、连续的输入操作、连续的输出操作、连续的相加操作等都是链式操作的样例。

链式操一定涉及到结合律的问题。比如链式操作赋值操作满足右结合律,即a=b=c被解释成a=(b=c)。而链式输出操作原则满足左结合律,即cout<<a<<b被解释成(cout<<a)<<b,基本数据类型的链式操作都有明白的定义。而涉及到类类型的链式操作则往往须要进行对应操作符的重载。

2.类的链式操作

为了实现类的链式操作,使链式操作可以进行,操作符的重载必须满足一定的要求:

(1)操作符重载函数一定不能返回void类型。

由于void类型不能參与不论什么运算,所以,操作符重载函数返回void类型实际上是阻止了链式操作的可能性。

(2)对赋值操作符进行重载,假设返回的是类的对象。那么链式赋值操作必须借助于拷贝构造函数才干进行。

这样不懂那会有较大的执行开销,还要编写正确的拷贝构造函数。

考察以下的程序。

#include 
using namespace std;class Complex{ double real; double image;public: Complex(double r=0.0,double i=0.0){ real=r; image=i; } Complex(const Complex& c){ cout<<"Copy Constructor"<

程序的执行结果是:

这里写图片描写叙述

可以看到,在连续的两次赋值操作过程中,一共两次调用拷贝构造函数。第一次发生在执行c2=c1的操作中。函数的返回值(暂时对象)是由c1构造的,这时发生了一次拷贝构造函数的调用;第二次发生在为c3赋值的时候,赋值运算的返回值仍然是一个Complex类的对象。这时又发生了一次拷贝构造函数的调用。

让赋值操作依赖于拷贝构造函数,显然不是一种明智的做法。

思考:Complex& Complex::operator=(Complex& c){…},会有什么结果?

只将赋值运算符重载函数的申明和定义改动例如以下:

Complex& operator=(const Complex&);Complex& Complex::operator=(const Complex& c){    real=c.real;    image=c.image;    return *this;}

相同是上面的程序,输出结果为:

这里写图片描写叙述

也就是说,一次拷贝构造函数都没有调用。原因是赋值操作符函数返回Complex类的引用。不用产生一个新的暂时对象,这样大大提高了程序执行效率。所以。赋值运算符重载差点儿无一例外地返回引用。


3.实现输入输出的链式操作

输入操作符(>>)和输出操作符(>>)的重载函数必须返回引用,否则链式无法操作无法完毕。

一般来说,实现输入操作符重载,一律採用例如以下函数原型:

istream& operator>>(istream&, className&);

而实现输出操作符重载,一律採用例如以下函数原型:

ostream& operator<<(ostream&, className&);

假设操作符函数的返回的是istream或ostream类的对象。而不是引用,会出现编译错误。出错的原因以及关于输入输入操作符的重载,敬请期待我的兴许blog。


參考文献

[1] ]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社。2008.

你可能感兴趣的文章
分布式服务框架 Zookeeper(二)官方介绍
查看>>
C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。...
查看>>
HTTP长连接和短连接 + Websocket
查看>>
Runtime-消息发送和消息转发
查看>>
机器学习、深度学习、和AI算法可以在网络安全中做什么?
查看>>
监听发现局域网dropbox客户端broadcast-dropbox-listener
查看>>
springboot 启动的时候报错 Error creating bean with name 'solrClient'
查看>>
【IntelliJ IDEA】在idea上操作 git分支合并【如何将远程swagger分支 合并到 远程 master分支上】【如何切换 本地分支】...
查看>>
SuperMap iObject入门开发系列之三管线系统标注
查看>>
你需要知道的缓存击穿/穿透/雪崩
查看>>
[转]Hyper-V功能大跃进 或引发市场洗牌
查看>>
关于excel导入到封装成工具类jar包和web版门店收银网络无法无法连接上的解决方法...
查看>>
@InitBinder
查看>>
嵌套类可以先在外围类中声明,然后在外围类中定义
查看>>
win7组件服务COM+应用程序编录错误解决办法
查看>>
腾讯微信技术总监周颢:一亿用户增长背后的架构秘密
查看>>
在Solaris系统中,查看tcp/ip配置
查看>>
Android getWindow().setFlags方法
查看>>
POJ 3278 Catch That Cow
查看>>
实用正则手机和邮箱
查看>>