找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1944|回复: 6

[讨论]关于引用&的一个问题

[复制链接]
发表于 2009-11-4 01:11:29 | 显示全部楼层 |阅读模式 IP:江苏扬州
#include<iostream.h>
class Increase
{
public:
Increase(int x):value(x) {}
Increase& operator++(); //换成Increase Increase::operator ++()
Increase operator++(int); //后增量
void display()
{
cout<<"the value is:"<<value<<endl;
}
private:
int value;
};
Increase& Increase::operator ++() //换成Increase Increase::operator ++()
{
value++;//先增量
return *this;//再返回原对象
}
Increase Increase::operator ++(int)
{
Increase temp(*this); //临时对象存放原有对象值
value++; //原有对象增量修改
return temp; //返回原有对象值
}
void main()
{
Increase n(20);
n.display();
(n++).display(); //显示临时对象值
n.display(); //显示原有对象
++n;
n.display();
++(++n);
n.display();
(n++)++; //第二次增量操作对临时对象进行
n.display();
}


把Increase& Increase::operator ++() 换成Increase Increase::operator ++() 结果为什么就不一样了呢/?
发表于 2009-11-4 01:11:30 | 显示全部楼层 IP:江苏扬州
当你把前增量重载函数返回的是值得时候
void main()
{
Increase n(20);
n.display(); //
(n++).display(); //
n.display(); //
++n;
n.display(); //
++(++n); //这里第一次加的时候,被加的是当前对象,而它返回一个值,那么第二次加,被加的对象是返回的值,而不是当前的对象n
n.display();
(n++)++; //
n.display();
}
回复

使用道具 举报

发表于 2009-11-4 01:11:31 | 显示全部楼层 IP:江苏扬州
上面那个什么后增量 Increase operator++(int); 是什么啊? Increase 不是一个类吗?
怎么后面这么奇怪operator++(int); 到底是什么用法? 我c++学的不怎么好 现在想好好钻一把,
还请高手不吝 说一下哈!
回复

使用道具 举报

发表于 2009-11-4 01:11:32 | 显示全部楼层 IP:江苏扬州
Increase::operator++(int);是个重载++运算符的函数,所以,就可以这样n++;(n是Increase类型的一个实例)
同理Increase::operator ++() ,借可以++n
慢慢来,以后你会学到的
回复

使用道具 举报

发表于 2009-11-4 01:11:33 | 显示全部楼层 IP:江苏扬州

当你把前增量重载函数返回的是值得时候
void main()
{
Increase n(20);
n.display(); //
(n++).display(); //
n.display(); //
++n;
n.display(); //
++(++n); //这里第一次加的时候,被加的是当前对象,而它返回一个值,那么第二次加,被加的对象是返回的值,而不是当前的对象n
n.display();
(n++)++; //
n.display();
}

我是问把Increase& operator++(); 这个函数里面的&去掉为什么不同??????
回复

使用道具 举报

发表于 2009-11-4 01:11:35 | 显示全部楼层 IP:江苏扬州
跟你解释一下:
++(++n); 这个式子, 对于 那个 带 & 的函数来讲, 参与运算的是对象本身, 返回的也是该对象本身, 所以你看到的结果是两次++ 的结果。

现在你把那个函数中的 & 去掉, 那么当你(++n) 运算的时候, 参与运算的虽然确实是该对象本身, 但是当你返回该对象时, 返回的却是一个该对象的copy, 也就是说该对象并没有参与那个括号外的 ++ 运算, 参与那个括号外的 ++ 运算的是该对象的一个copy. 所以该对象本身的值只增加了一次.

问题的根本其实就是 传值 和 传对象的区别, 这里的传 有两个方面, 一个方面是有可能在函数入口端发生, 另一种发生的可能性是函数的出口端, 就你的问题就是 函数出口端 发生的 传值 和 传对象 的问题.

总结如下, 如果你在函数入口端使用 引用(&) 或地址(*) 那么将是对象本身参与工作, 反之, 参与工作的是另一个临时变量.
如果你在函数出口端使用 引用(&) 或地址(*) 那么将返回对象本身, 反之, 将返回一个该对象的copy.
回复

使用道具 举报

发表于 2009-11-4 01:11:36 | 显示全部楼层 IP:江苏扬州

明白了
谢谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-10-1 01:26 , Processed in 0.218387 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表