新人求教育4 ++运算符重载

dengdayuge 2015-01-14 05:18:26
#include <iostream>
using namespace std;
class Fraction
{

private:
int den;
int num;
public:
Fraction(int i=1,int k=0):den(i),num(k)
{

}

Fraction& operator ++()
{
num+=den;
return *this;
}

Fraction& operator ++(int)
{
Fraction old(*this);
++(*this);
return old;
}
friend ostream & operator <<(ostream & out,const Fraction & x);
};

ostream & operator<<(ostream & out, const Fraction & x)
{
out<<x.den<<endl;
out<<x.num<<endl;
return out;
}

int main()
{
Fraction b(10,10);
cout<<b++<<endl;
cout<<++b<<endl;
return 0;
}

输出:10
32767

10
30

问:32767怎么来的?
...全文
352 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztenv 版主 2015-01-16
  • 打赏
  • 举报
回复
++(int)函数中还能返回局部对象的引用?
凤梨头头 2015-01-15
  • 打赏
  • 举报
回复
Fraction& operator ++(int) { Fraction old(*this); ++(*this); return old; } 你这里的函数表示的是后缀++,old是在一个局部对象,函数使用完old会自动释放的,返回old的引用会导致出错。所以这个函数的返回类型应该是 Fraction,而不是Fraction&。 改为 Fraction operator ++(int) { Fraction old(*this); ++(*this); return old; }应该就对了。
lm_whales 2015-01-15
  • 打赏
  • 举报
回复
++ 运算符的实现方案,一般这么处理
  Fraction& operator ++() //前缀 ++运算符,实现自增,返回引用(即 *this)
    {
        num+=den;
        return *this;
    }
    
    Fraction operator ++(int)// 后缀 ++运算符,返回一个新对象(执行自增前的值)即可
    {
        Fraction old(*this);
        ++(*this);
        return old;
    }
danchu 2015-01-14
  • 打赏
  • 举报
回复
cout<<b++<<endl ,该语句调用Fraction& operator ++(int),该函数声明一个局部对象, 然后返回其引用,所以在输出的时候,传入operator<<中的地址是一个无效地址,导致输出错误。
pengzhixi 2015-01-14
  • 打赏
  • 举报
回复
Fraction operator ++(int)
michael2988 2015-01-14
  • 打赏
  • 举报
回复
b++ 调用了 Fraction& operator ++(int) 返回局部变量的引用 而 ++b 调用的是 Fraction& operator ++()。 修改为

Fraction& operator ++(int)
 {
    Fraction old(*this);
    ++(*this);
    //return old;
    return *this;
}
试下
dengdayuge 2015-01-14
  • 打赏
  • 举报
回复
...不懂啊,忘了邀请大神了

64,701

社区成员

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

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