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;
        };
    };
    

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

  • 相关阅读:
    git学习笔记
    angular自定义指令-1
    转 三范式
    CentOS 7 安装NVIDIA驱动实现修改分辨率和扩屏功能
    acm 2034
    acm 2031
    记票统计
    acm 2020 map 逆向输出
    acm 2014
    将输入的字符一个一个读入
  • 原文地址:https://www.cnblogs.com/savennist/p/12855542.html
Copyright © 2011-2022 走看看