请教关于C++中的前置与后置自加运算符重载

weicheichei 2010-11-01 03:11:04
const num &operator++()
{
++n;
return *this;
}
const num operator++(int o)
{
num temp(*this);
++n;
return temp;
}

前面那个是我在一个类里重载的前置自加运算符,后一个是后置自加。在后面调用++的时候怎么知道什么时候调用用前置,什么时候用后置。
比如num n=i++;为什么就调用的是后一个呢,求高手给解答下;
...全文
1060 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zenseven 2012-03-05
  • 打赏
  • 举报
回复
你们全部没有理解LZ的意思 当遇到 ++i时调用的是i.operator++() 遇到 i++调用的是i.operator++(int o) LZ的意思是凭什么会这样 而不是 当遇到 ++i时调用的是i.operator++(int o)遇到 i++调用的是i.operator++()
其实这个我自己也不是很了解 个人觉得是定义库函数的那些大佬们规定的 也是就说没有道理的道理 LZ只要记住就OK了
jingkai315918 2010-11-01
  • 打赏
  • 举报
回复
前置是先加1,然后赋值
后置式先赋值,再加1
浅行 2010-11-01
  • 打赏
  • 举报
回复
我今天也看到这儿了
weicheichei 2010-11-01
  • 打赏
  • 举报
回复
谢谢大家的关注。
weicheichei 2010-11-01
  • 打赏
  • 举报
回复
非常感谢15楼的关注
weicheichei 2010-11-01
  • 打赏
  • 举报
回复
当把int 0放在前面的那个定义里面的时候,就像上面的程序执行的结果就错了是调用了后置,
把int 0放在后面的时候就对了,执行的是前置,我就是想问下int 0 是怎么影响程序的。谢谢大家讨论;
linsen_519 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 weicheichei 的回复:]

#include<iostream>
using namespace std;
class num
{
public:
num(){n=1;cout<<"不带参数的构造函数执行"<<endl;}
num(int i){n=i;cout<<"带参数的构造函数执行"<<endl;}
num(const num&s){n=s.n;cout<<"复制构造函数执行"<<endl;}
……
[/Quote]
都能被LZ气死了。。。你再看看 你贴的代码里面的两个operator,和你标题描述的里面描述的一样吗?
真想杀了你...
weicheichei 2010-11-01
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
class num
{
public:
num(){n=1;cout<<"不带参数的构造函数执行"<<endl;}
num(int i){n=i;cout<<"带参数的构造函数执行"<<endl;}
num(const num&s){n=s.n;cout<<"复制构造函数执行"<<endl;}
~num(){cout<<"不带参数的析构函数执行"<<endl;}
int get()const{return n;}
void set (int x){n=x;}
void add(){++n;}
const num &operator++(int o)
{
++n;
return *this;
}
const num operator++()
{
num temp(*this);
++n;
return temp;
}
private:
int n;

};
int main()
{
num i;
cout<<"i: "<<i.get()<<endl;
i.add();
cout<<"i: "<<i.get()<<endl;
num n=++i;
cout<<"n: "<<n.get()<<endl;
cout<<"i: "<<i.get()<<endl;
return 0;
}全部程序就是这个了。
maoxing63570 2010-11-01
  • 打赏
  • 举报
回复
重载了使楼主连它最基本的意思都搞糊涂了,个人觉得重载只是使代码更直观,使类这种数据类型使用起来跟内置的类型形势上是一致,当然它的意思也应该跟内置的操作符保持一致(这虽然不是必须的,你可以重载+来执行减)
请看下面的代码
int i=0;
i++;//返回i,然后i=i+1;
++i;//返回i=i+1;
对于类的情况,你的代码也指出来了
最后说一点就是,重载操作符,不要忘记它最基本的意思
wumuzi 2010-11-01
  • 打赏
  • 举报
回复
朋友,你要知道,num n = i++,的函数必须用中间值返回,也就是函数是现实时必须有一个中间变量temp,

为什么呢?
因为 num n = i++,内部实现是将i的值先保存,然后将其加1,最后返回原来未加1的值,所以需要用一个中间变量来保存i值

而num n = ++i,运行后的n和i值一样,也就是值同步,所以不需要,用中间变量来保存数据,只需要将i值加1后,返回就行。

建议你看看c++primer中关于++重载这一块,里面讲的很透彻!
linsen_519 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 weicheichei 的回复:]

const num &operator++()
{
++n;
return *this;
}
const num operator++(int o)
{
num temp(*this);
++n;
return temp;
}

在这种情况下num n=i++;就是后置自加就调用第二个,正确。
const num &operator++(int o)
……
[/Quote]
贴 全部代码!
gules 2010-11-01
  • 打赏
  • 举报
回复
我们只要重载++时,只要认清前置++是没有参数的,后置++是有一个int型参数的就行了;
实际调用的区分是编译器的事!
weicheichei 2010-11-01
  • 打赏
  • 举报
回复
const num &operator++()
{
++n;
return *this;
}
const num operator++(int o)
{
num temp(*this);
++n;
return temp;
}

在这种情况下num n=i++;就是后置自加就调用第二个,正确。
const num &operator++(int o)
{
++n;
return *this;
}
const num operator++()
{
num temp(*this);
++n;
return temp;
}

在这种情况下num n=i++;就是后置自加就调用第一个,也就是错误的调用。
这是为什么呀?
wumuzi 2010-11-01
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
class num
{
private:
int n;
public:
num():n(0){}
num(num&);
int getn()
{
return n;
}
const num& operator ++();
const num& operator = (const num&);
const num operator ++(int);
};

num::num(num& b)
{
n = b.n;
}

const num& num::operator ++()
{
++n;
return *this;
}

const num& num::operator = (const num& c)
{
n = c.n;
return *this;
}

const num num::operator ++(int)
{
num temp(*this);
++(this->n);
return temp;
}

int main()
{
num a;
num b;
b = a++;
cout << "b "<< b.getn() << " " << "a " << a.getn() << endl;
num c;
c = ++b;
cout << "c "<< c.getn() << " " << "b " << b.getn() << endl;
system("pause");
return 0;
}

朋友,你把我给你的程序用单步调试一下看看,这是各自调用各自的函数。

带参数是后置++
不带参数是前置++

c++primer里面也有提到过的,你可以看看。
luciferisnotsatan 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 linsen_519 的回复:]

最大的区别是~前置++返回本身。无临时对象产生 ++i
后只++返回的是tmp,会产生一个临时对象。 i++

你的代码不是表现的很清楚了吗?

第一个,返回的是num对象的引用!
第二个,返回的是num对象。

如果LZ明白引用的含义那么,就应该不用解释了
[/Quote]
正解
wozuiqiang001 2010-11-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 weicheichei 的回复:]

参数只不过是把他们区别开,,在这里好像没有什么实际的意义。我的意思是在函数中operetor++,程序如何判断i++是调用后一个呢?
[/Quote]
++放在后面,就判断调用后一个。i++就调用后一个,++i就调用前一个
我只能这么理解你的问题了
linsen_519 2010-11-01
  • 打赏
  • 举报
回复
最大的区别是~前置++返回本身。无临时对象产生 ++i
后只++返回的是tmp,会产生一个临时对象。 i++

你的代码不是表现的很清楚了吗?

第一个,返回的是num对象的引用!
第二个,返回的是num对象。

如果LZ明白引用的含义那么,就应该不用解释了
hai040 2010-11-01
  • 打赏
  • 举报
回复
一个有参数,一个没参数
编译自然分得出来
weicheichei 2010-11-01
  • 打赏
  • 举报
回复
参数只不过是把他们区别开,,在这里好像没有什么实际的意义。我的意思是在函数中operetor++,程序如何判断i++是调用后一个呢?
FrankHB1989 2010-11-01
  • 打赏
  • 举报
回复
重载操作符的参数列表空的是前置,有int的是后置。
加载更多回复(2)

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧