• C++中的链式操作


    代码编译环境: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.

  • 相关阅读:
    JavaScript学习(一)
    CSS学习(1)(网页编程)
    学习MVC3(二)——创建自己的第一个网页:实现用户登陆(1)
    C#多态小结——面向对象编程的三大机制之二
    学习网页编程(一)
    开始的2012
    基于jquery的上传插件Uploadify 3.1.1在MVC3中的使用:上传大文件的IO Error问题
    网页编程注意
    基于jquery的上传插件Uploadify 3.1.1在MVC3中的使用
    BackgroundSize
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7214564.html
Copyright © 2020-2023  润新知