关于重载后缀运算符

谁学逆向工程 2009-11-11 05:45:16
#include "iostream"
using namespace std;
class counter
{
public:
counter():itsval(0){}
~counter(){}
int getitsval() const{return itsval;}
void setitsval(int x){itsval=x;}
const counter & operator++(){++itsval;return *this;}
const counter & operator++(int){counter temp(*this);++itsval;return temp;}
private:
int itsval;
};
void main()
{
counter i;
cout<<i.getitsval ()<<endl;
++i;
cout<<i.getitsval ()<<endl;
++i;
cout<<i.getitsval ()<<endl;
counter a=++i;
cout<<"a.getval(): "<<a.getitsval ()<<endl;
cout<<"i.getval(): "<<i.getitsval ()<<endl;
a=i++;
cout<<"a.getval() "<<a.getitsval ()<<endl;
cout<<"i.getval() "<<i.getitsval ()<<endl;
}


counter temp(*this);++itsval 是什么意思
...全文
103 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
abc25485808 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lianshaohua 的回复:]
counter temp(*this);++itsval  是什么意思?
//调用counter的拷贝构造函数,用*this(当前对象)来实始化temp对象,这样就能保存当前对象的状态了,你那个函数再返回temp对象(++之前的对象的状态)
[/Quote]
赞同
信念 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 thy38 的回复:]
调用拷贝构造来复制一份自身,用作返回。
[/Quote].
ztenv 版主 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 elpep 的回复:]
const counter & operator++(int)
{
counter temp(*this);
++itsval;
return temp;
}

这句错了。
[/Quote]
其实你的确不能返回引用,因为temp是个局部对象,离开函数就消失了。。。
jiangchaobo 2009-11-11
  • 打赏
  • 举报
回复
首先为你指出一个错误:const counter & operator++(int){counter temp(*this);++itsval;return temp;} 里面引用& 不要,理由是为了和内置操作符一致,后缀式操作符应返回旧值,并且应作为值返回,而不是返回引用。理由根据来源于c++primer 448页。在为你介绍*this之前,先解释另外一个问题给你:假如counter a,定义一个counter对象a,a++就相当于a.operator++(int);这里面的this就是指向a,所以*this就是a,++itsval就是对itsval加1返回加1后的值。
elpep 2009-11-11
  • 打赏
  • 举报
回复
const counter & operator++(int)
{
counter temp(*this);
++itsval;
return temp;
}

这句错了。
harizu76 2009-11-11
  • 打赏
  • 举报
回复
重载后缀不是太懂。学习一下
clhposs 2009-11-11
  • 打赏
  • 举报
回复
后缀自增的返回值千万不能为引用
因为你是引用了一个局部对象


#include <iostream>

class A
{
public:
A()
{
i = 0;
}
A& operator++();
A& operator++(int i);

friend std::ostream& operator<<(std::ostream &os, const A &a);
private:
int i;
};

A& A::operator ++()
{
++i;
return *this;
}

A& A::operator ++(int i)
{
A a(*this);
++this->i;
return a;
}

std::ostream& operator<<(std::ostream &os, const A &a)
{
os << a.i;
return os;
}

int main()
{
A a;
std::cout << a << std::endl;
std::cout << ++a << std::endl;
std::cout << a++ << std::endl; //输出的值未定义
std::cout << a << std::endl;

system("pause");
return 0;
}



//测试
#include <stdio.h>
#include <stdlib.h>

int main()
{
int i = 1;
//该语句错误error C2106: '=' : left operand must be l-value 因为后置自增返回类型是一个int型,而不是int&,前置自增返回的是int&
i++ = 2;
printf("%d", i);

system("pause");
return 0;
}
sj13426074890 2009-11-11
  • 打赏
  • 举报
回复
后缀++,是先用后加。所以要先用temp复制一份,调用拷贝构造函数。
thy38 2009-11-11
  • 打赏
  • 举报
回复
调用拷贝构造来复制一份自身,用作返回。
jackyjkchen 2009-11-11
  • 打赏
  • 举报
回复
构造一个本身
xixiaoliu 2009-11-11
  • 打赏
  • 举报
回复
先把 *this 复制到 temp
再把 this->itsval 加 1
最后返回 temp
ztenv 版主 2009-11-11
  • 打赏
  • 举报
回复
counter temp(*this);++itsval 是什么意思?
//调用counter的拷贝构造函数,用*this(当前对象)来实始化temp对象,这样就能保存当前对象的状态了,你那个函数再返回temp对象(++之前的对象的状态)

64,642

社区成员

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

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