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


1.什么是链式操作

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

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

2.类的链式操作

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

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

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

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

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

考察以下的程序。

#include <iostream>
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"<<endl;
real=c.real;
image=c.image;
} void Show(){
cout<<real<<"+"<<image<<"i"<<endl;
}
Complex operator=(const Complex&);
}; Complex Complex::operator=(const Complex& c)
{
real=c.real;
image=c.image;
return *this;
} int main(int argc,char* argv[])
{
Complex c1(2.3,4.5),c2,c3;
c1.Show();
c3=c2=c1;
c2.Show();
c3.Show();
getchar();
}

程序的执行结果是:

可以看到,在连续的两次赋值操作过程中,一共两次调用拷贝构造函数。第一次发生在执行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.

C++中的链式操作的更多相关文章

  1. thinkphp5.1中使用链式操作的坑

    1.在进行tp5->tp5.1的时候,没有想太多,直接使用之前的代码:结果在该操作中,多次调用该get方法,tp5.1的链式操作一直保持了之前的搜索条件,截图如下:(具体的代码没有展示) 2.然 ...

  2. php 链式操作的实现 学习记录

    php 面向对象中实现链式操作的关键部分:调用的方法中返回当前对象 ,从而实现链式操作: <?php namespace commom; class db { public function w ...

  3. PHP实现链式操作的三种方法详解

    这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具 ...

  4. PHP中的__toString方法(实现JS里的链式操作)

    _toString方法是在打印对象时自动调用的魔术方法,如果不声明会报以下错 Catchable fatal error: Object of class String could not be co ...

  5. jquery中链式操作的this指向

    jquery中链式操作是如何实现? 例如:$(obj).children().css('color','red').next().css('color','red').siblings().css(' ...

  6. Laravel框架中的数据库CURD操作、连贯操作、链式操作的用法

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...

  7. 用php实现一个简单的链式操作

    最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen( ...

  8. jQuery链式操作[转]

    用过jQuery的朋友都知道他强大的链式操作,方便,简洁,易于理解,如下 $("has_children").click(function(){ $(this).addClass( ...

  9. PHP链式操作输出excel(csv)

    工作中经常会遇到产品运营让导出一些简单的比较规范的数据,这时候要是有一个简单的方法可以用就简单多了.下面是我的一个输出简单的excel(csv)的方法类,用到了链式操作.说到链式操作,在jquery中 ...

随机推荐

  1. BZOJ 4504: K个串

    题目大意: 求一个序列的第k大的子串和. 题解: 对于一个右端点找最优的左端点,扔进堆里. 每次取堆顶,将这个右端点可以选择的左端点的区间分成两段,扔进堆里,重复k次. 现在需要对于一个固定的右端点, ...

  2. spring-boot-mustach-template

    spring模板引擎mustache https://www.baeldung.com/spring-boot-mustache 这篇文章文件的名字都是.html结尾自己试了下并不行 需要将.html ...

  3. Python paramiko模块 + 堡垒机

    paremiko SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: import paramiko    # 创建SSH对象 ssh = paramiko.SSHClient ...

  4. kali-xfce的简单配置

    1.更新 设置kali的更新源 在终端中打开sources.list root@kali:~# vim /etc/apt/sources.list 删除里面的注释,清空. 然后输入下面的更新源地址: ...

  5. vim使用技巧二 模式

    第一部分模式 第2章  普通模式 打开vim的默认状态即为普通模式   普通模式的命令强大  很大程度源于可以把操作符与动作命令结合在一起 技巧7 停顿时请移开画笔   工欲善其事,必先利其器   准 ...

  6. layer2-1 二层

    一   概述    一层的相关介绍 CSMA/CD 网桥和交换机的区别 冲突    共享      端口密度     性能   功能   交换机的三种主流转发方式 存储转发         完整的收到 ...

  7. A. Nearest Common Ancestors

    A. Nearest Common Ancestors Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 10000KB   64-bi ...

  8. LINQ学习笔记 Join 与 Group join

    LINQ中的Join对应T-SQL中的内连接,并无左连接的方法,当然也没有右连接. 要达成Left join必须依靠GroupJoin来完成. GroupJoin顾名思义就是先集团在做加入,加入的不同 ...

  9. HDU 1565 方格取数(1) ——插头DP

    [题目分析] 其实直接状压就可以了. 但是有点闲,又写了一个可读性极差,智商低下,很(gou)好(pi)的代码 [代码] #include <cstdio> #include <cs ...

  10. hihoCoder1381 - Little Y's Tree

    Portal Description 给出一个\(n(n\leq10^5)\)个点的带边权的树.进行\(Q\)次询问:每次删除树上的\(k\)条边,求剩下的\(k+1\)个连通块中最远点对距离的和.\ ...