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

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

原文地址:https://www.cnblogs.com/savennist/p/12855542.html