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