| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 645 人关注过本帖
标题:[求助]请教一个关于&的问题
只看楼主 加入收藏
梦魇琴嚣
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-2-14
收藏
 问题点数:0 回复次数:9 
[求助]请教一个关于&的问题

比如有种情况 定义了两个类A和B 在B中定义了个函数m 它的返回值类型是A类的对象
class A
{....};
class B
{
....
A& m()
{...}
....
};
我看教科书上是这么写的 请问这个&在这里是啥意思?是说返回值是类的对象的函数都要这么写吗?为什么返回值是一般数据类型的就不用写这个&呢? 还是说书印错了。。。。- -!


问题很菜 还繁请前辈赐教

搜索更多相关主题的帖子: 教科书 
2006-02-27 02:44
西部天狼
Rank: 1
等 级:新手上路
帖 子:95
专家分:0
注 册:2006-2-23
收藏
得分:0 
&表示引用,在这里表示A类对象的引用。返回值是类的对象的函数也可以这样写:A m(){...};这两种写法的运行结果和意义都不同,前者属于浅拷贝,后者属于深拷贝。

学习-->编程-->交流-->再学习-->再编程-->再交流
2006-02-27 04:20
yy_007
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-2-27
收藏
得分:0 
2006-02-27 09:52
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 
以下是引用梦魇琴嚣在2006-2-27 2:44:00的发言:

比如有种情况 定义了两个类A和B 在B中定义了个函数m 它的返回值类型是A类的对象
class A
{....};
class B
{
....
A& m()
{...}
....
};
我看教科书上是这么写的 请问这个&在这里是啥意思?是说返回值是类的对象的函数都要这么写吗?为什么返回值是一般数据类型的就不用写这个&呢? 还是说书印错了。。。。- -!


问题很菜 还繁请前辈赐教

C++使用&引用,主要用在参数传递和返回值上,而且主要针对类或结构进行引用,这是基于效率考虑的,因为类和结构一般来说比较大,直接复制副本的话很耗时间,如果用引用操作,则是用实参的别名,表示的是同一个地址。对于一般数据类型,没有必要用引用,因为对一般数据类型直接复制副本跟引用传递效率相当。


谷底深深行 ,峰顶漫漫步......@_@
2006-02-27 10:35
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
4楼说得不错。

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-02-27 10:41
梦魇琴嚣
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-2-14
收藏
得分:0 

感谢几位的帮助 不知道我理解的对不对

也就是说 也可以写成A m() {...} 只是基于效率的考虑 写成A& m(){..} 效率更高 而这两种写法都是返回A类的一个对象 结果是相同的?

2006-02-27 15:01
yuanbing
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2006-2-16
收藏
得分:0 

我也在期待答案.


2006-02-27 15:04
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
嗯,但是你要用另一个对象去“等于” 这个函数的返回值的话,就要小心了。因为如果你没有重载 “=”,很有可能程序会出错噢。这就涉及到了2楼说的深浅拷贝问题了。一般默认的赋值操作符是浅拷贝的,对于自定义的类型,要重载“=”或者定义一个拷贝构造函数。

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-02-27 15:08
梦魇琴嚣
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-2-14
收藏
得分:0 

忠心感谢斑竹姐姐如此耐心 小弟愚钝还想再麻烦姐姐一下

您所说的关于“等于”的这个事情和我上面说的那个问题有什么联系呢? 还是说只是一个对我的忠告 您说的这是后续事宜里需要注意的地方?
因为我这里这个代码有点长 而且是那种最基本 最简单的东西 没啥价值 我觉得都写出来实在是浪费空间 其他部分我觉得我理解的是正确的 它是这么个意思:
比如A类有个成员函数叫v B类有刚才那个函数m m的作用就是返回A类的一个对象a 于是如下:
class A
{....
void v(int m,int n){}
...
};
class B
{.....
A& m()
{return a;}
};
void main()
{....
b.m().v(4,6); //b是B类的一个对象
....
}

2006-02-27 23:41
西部天狼
Rank: 1
等 级:新手上路
帖 子:95
专家分:0
注 册:2006-2-23
收藏
得分:0 

4楼说的比较清楚了,就你目前提供的问题线索,用这种方式解答完全够了。
而版主所说的赋值情况是后续情况。

A& aa = b.m();
A aaa = b.m();

这两句的理解就要用到版主所说的概念了。

前者aa的赋值属于浅拷贝,aa 仅是A型对象的一个别名,一个对象A型对象的引用。
后者aaa的赋值属于深拷贝,aaa 是A型对象的一个内存中的复本。


学习-->编程-->交流-->再学习-->再编程-->再交流
2006-02-28 03:33
快速回复:[求助]请教一个关于&的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017481 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved