问个重载 ++ 前缀,和 << 的问题
const INT operator++(int)
{
INT temp=*this;
(this-> m_i)++;
return temp;
}
为什么要有个 int 参数?
=======================================================
ostream& operator < <(ostream os, const INT& i)
{
}
调用的时候是 cout < <a; 按这格式应该是 < <(cout,a; 才对。
[解决办法]
好象 c++ primer还是高质量C++中看过
重载++有两种 即 ++i 和 i++
有一种是看作 + 0 记不清楚了
第二个应该不是类的成员函数重载吧,楼主别搞混淆了
[解决办法]
据我所了解第一个++运算符重载是对操作数进行后缀++,没有int的话就是前缀++, 至于第二个那是因为 < <的原因,需要用到输出流cout加 < <再加一个对象(个人感觉是跟 < <的操作数与被操作数有关),由于所学甚少,还望大家进一步指点。
[解决办法]
关于第一个问题:为什么要有个 int 参数?
那是因为有两种++和--操作符,一种是前置的++和--,另一种是后置的++和--。为了区别这两种重载的区别,对后置的情况加了一个int型的参数,作为识别。又因为它没有被用在操作符的定义里面,而编译器又为它提供了缺省值,所以调用的时候该参数可以被忽略,这也是该参数可以不命名的原因。
const INT operator++(int)
{
INT temp=*this;
(this-> m_i)++;
return temp;
}
this表示你这是对类的成员操作符的重载,又里面有一个int型的参数,本人猜测你是对成员函数操作符(后置++)的重载。
关于第二个问题:
楼主是按一般的函数调用去理解的哈,函数名(参数1,参数2),这个好像是:
对于需要两个参数非成员操作符的调用:操作符左边的作为参数1,右边的作为参数2吧
对于需要一个参数的成员操作符的调用:操作符左边为调用的对象名,右边的是参数
至于为什么要这么调用,肯定是为了方便和直观,估计这是编译器的一些机制吧,我也是个菜鸟级别的哈,不过最近在研究,有什么不对,还望高手指出哈
[解决办法]
对于第二点,记忆重载运算符的格式是可以参照定义函数的格式,但不能像记忆函数调用那用去记运算符使用。
倘若
bool operator+(int tmp)
{
_var1+=tmp;
return ture;
}
那调用岂不要变成了
a+(b)
[解决办法]
重载了 operator < < 后,是按照operator < <(cout,a)调用的,然后将cout,a赋给形参,代入函数进行运算的。一切都按照函数调用方式来的。
[解决办法]
#include <iostream.h> //我用VC6.0 修该了一下
//using namespace std;
ostream& operator < <(ostream& os, int& a)
{
os.operator < <(a);
return os;
}
int main()
{
int a=1;
operator < <(cout,a);
return 0;
}
正确
这里的operator < <(cout,a); 相当于调用一个函数, 当然不会错啊
[解决办法]
只要你想重载递增与递减运算符,你要记住每个操作符有前递增与后递增的版本,以下是递增的例子:
int i=5;int j = i++; // j == 5, i == 6.j = ++i; // i == 7, j == 7.
注释:返回值有对于前递增与后递增是不同的,C++语言定义了前递增版本是无参数,后递增是有一个整数参数,你的类应该象如下定义:
//前递增,例:++iMyClass& operator++ (){// ... whatever is necessary.return *this;}
//后递增,例:i++MyClass operator ++ (int){// Make a copy.MyClass rval (*this);// ... whatever is necessary.// to increment *this.// Return the old value.return rval;}
在通常驻,你应该支持前递增与后递增的两个版本,但有时候,只需要前递增版本,后递增版本需要你拷类对象;有时,拷贝对象是昂贵的代价,所以只支持前递增;当对象使用大多的内存来进行拷贝构造的时候,我不赞成支持后递增,类的使用者不知道没有拷贝构造的支持是无法支持后递补增的。
[解决办法]
操作符重载就是语言定义的一个规则,将某种形式的表达式判决成一个函数调用。
比如表达式 l-obj < < r-obj 。设l-obj的类型是l-type,r-obj的类型是r-type。那么这个表达式判决成如下两个函数调用之一(这里忽略cv-specifier等细节):
1) 全局函数 l-type& operator < <(l-type&, r-type&);
2) 成员函数 l-type& l-type::operator < <(r-type&);
所以,为了使判决成功,这两个函数只能定义一个,否则 l-obj < < r-obj 是ill-form的表达式。表达式 l-obj < < r-obj 可以看成上面两个函数之一的隐式调用方式,或简写方式。
当然,即使两个都定义了,它们各自的显示调用是没有问题的。只是不能再用 l-obj < < r-obj 了。
PS:在上面的例子里l-obj是cout, r-obj是a,l-type是ostream,r-type是int