首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

问个重载 ++ 前缀,和 << 的有关问题

2012-03-15 
问个重载 ++ 前缀,和 的问题constINToperator++(int){INTtemp*this(this- m_i)++returntemp}为什么

问个重载 ++ 前缀,和 << 的问题
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

热点排行