zoukankan      html  css  js  c++  java
  • C++运算符重载中的问题

    C++运算符重载中的问题

    这里主要探讨几个C++运算符重载中的问题。我尽量在讨论过后给出固定化的一般式模板。

    自增自减运算符的重载

    这类运算符在重载时要完全区别前置后置两种重载形式。

    其他 是否加int 返回值类型 返回方式
    前置 已存在变量的引用类型 *this
    后置 非引用、临时变量 拷贝局部变量
    class Time
    {
    public:
        int x;
        Time():x(100){};
        //前置
        Time& operator++ ()
        {
            x++;
            return *this;
        };
        //后置
        Time operator++ (int)
        {
            Time s(*this);//做一个原变量的拷贝,最好有拷贝构造函数。
            x++;
            return s;//这里将会以拷贝的形式返回
        };
    };
    

    输入输出运算符重载

    这两个运算符建议作为友元进行重载,友元的定义直接写在类定义内即可。

    1、为什么流都必须引用而且不能const修饰?

    答:标准库中流是不能够进行拷贝复制的,所以只能引用。向流输入输出数据的操作本身就对流进行了修改,所以引用的流是不能够const限制的。

    2、为什么输出流中第二个参数Time要加const限制,而输入流不用呢?

    答:在某些情况下,向os输出的并不一定是已定义的变量,也有可能是一个临时变量。例如,

    Time p;//内部重载后置++运算符
    cout<<p++<<endl;
    

    此时,p++返回的是一个临时的Time变量。然而,C++中临时变量不能作为非const的引用参数(详细请进入链接),所以我们必须要使第二参数加const来满足这种情形。而由于输入流是要修改第二参数Time的,所以不仅要对第二参数进行引用调用,而且还不能用const修饰

    class Time//这里是推荐的写法
    {
    public:
        string t;
        friend ostream& operator<< (ostream& os,const Time& rhs)
        {
            os<<rhs.t<<endl;
            return os;//一定要记得返回流
        };
        friend istream& operator>> (istream& in,Time& rhs)
        {
            in>>rhs.t;
            return in;
        };
    };
    

    暂时先写这些,上网课去了。。。

  • 相关阅读:
    A. Ivan the Fool and the Probability Theory
    关于消除“输出中最后的一个空格”问题
    半文件式输入中一种常见的输入方式
    持续输入问题
    汉诺塔问题
    给定两个正整数,求它们的最大公约数。
    第三届全国高校绿色计算机大赛(初赛题目)
    第三届全国高校绿色计算机大赛(初赛题目)
    C++中的输入及其原理简析
    流感传染
  • 原文地址:https://www.cnblogs.com/savennist/p/12855542.html
Copyright © 2011-2022 走看看