首页
社区
课程
招聘
[求助]这两行程序有什么区别啊 请具体举两个例子 谢谢
发表于: 2007-1-8 22:45 6114

[求助]这两行程序有什么区别啊 请具体举两个例子 谢谢

2007-1-8 22:45
6114

这两天学数据结构 碰到好多这种类型的程序 不懂什么意思 请各位帮忙一下  

CBTNode<T>*&    GetRoot();
CBTNode<T>*     GetRoot() const;

template<typename T>
inline CBTNode<T>*& CBTree<T>::GetRoot()
{
    return *(&(m_pNodeRoot));
}

template<typename T>
inline CBTNode<T>* CBTree<T>::GetRoot() const
{
    return m_pNodeRoot;
}

请问这两段的程序具体区别是什么  *(&(m_pNodeRoot)) 和 m_pNodeRoot 的区别是什么 返回值的具体区别又是什么

程序是老罗缤纷天地上的程序
http://www.luocong.com/dsaanotes/index-Z-H-9.htm
麻烦各位了


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
2
虽然很简单 但我实在搞不懂啊 大家帮帮忙撒
2007-1-9 13:02
0
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
3
怎么没有人帮忙啊 贴了几天了啊 是不是源代码错误啊 总要有人回答一下啊
2007-1-10 14:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
m_pNodeRoot应该是CBTNode<T>*类型的吧?
CBTNode<T>*& GetRoot();返回的是m_pNodeRoot的引用,
CBTNode<T>* GetRoot() const;返回的是m_pNodeRoot的值,不过这个值是const的,不允许修改。
比如有下面的两个变量:
CBTNode<T>* &p = GetRoot();//call CBTNode<T>*& GetRoot();
CBTNode<T>* const q = GetRoot();//call CBTNode<T>* GetRoot() const;
那么p就成为了m_pNodeRoot的一个引用,就是说&p == &m_pNodeRoot.而q只是数值上和m_pNodeRoot相等。
=======================================================
小弟新来的,不知道上面有没有说错什么,请高手指点。
2007-1-10 20:47
0
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
5
楼上说的我懂了 谢谢 但是 return *(&(m_pNodeRoot)); 没有见过
请问 *(&(m_pNodeRoot)) 和 m_pNodeRoot 区别是什么呢
*(&(m_pNodeRoot)) 怎么理解呢 高手说说撒
2007-1-11 00:24
0
雪    币: 184
活跃值: (65)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
*(&(m_pNodeRoot))先获取m_pNodeRoot的地址然后再取该地址上的值
2007-1-11 16:39
0
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
7
照楼上说的话 程序中*(&(m_pNodeRoot))可以用 m_pNodeRoot 代替 都是返回根结点的地址
这两种写法的区别是什么 *(&(m_pNodeRoot))可不可以用代替 为什么m_pNodeRoot
2007-1-12 01:25
0
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
8
照楼上说的话 程序中*(&(m_pNodeRoot))可以用 m_pNodeRoot 代替 都是返回根结点的地址
这两种写法的区别是什么 *(&(m_pNodeRoot))可不可以用m_pNodeRoot代替 为什么
2007-1-12 01:25
0
雪    币: 146
活跃值: (33)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
编译后在ida或od中看?
2007-1-14 02:16
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
10
照楼上说的话 程序中*(&(m_pNodeRoot))可以用 m_pNodeRoot 代替 都是返回根结点的地址
这两种写法的区别是什么 *(&(m_pNodeRoot))可不可以用m_pNodeRoot代替 为什么
=====================

可以。 首先,m_pNodeRoot就是一个CBTNode<T>*  类型,
对于返回A类型的引用, 那么可以直接返回一个A类型的对象,
只要这个对象不是函数局部对象就可以,
显然, 这里的A表示了CBTNode<T>*. 直接返回
m_pNodeRoot, 这也是最标准的写法。

*(&(m_pNodeRoot)), 老实说, 我认为这完全是鳖足没必要
的写法, 我估计作者当时一看引用, 就加了一个&, 但是编译
不过去啊, 于是有到前面加了一个*.......

当然, 还有一种原因, 一般返回一个对象的引用, 往往是返回
自己的引用, 但是c++里面只有this表示自己的指针, 没有
语法能表示自己的引用, 所以一般拷贝构造函数, 为了能连等,
都这么写.
const A & A::A(const A &)
{
   return *this;
}

可能作者习惯了引用就返回某个指针的*, 于是就先&得到
m_pNodeRoot的地址, 在*取值....
2007-1-14 17:45
0
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
11
最初由 sbright 发布
编译后在ida或od中看?

好主意   提问时还真没有想到

一开始我也认为这两种写法是一样的 但不肯定 以为是什么安全机制 谢谢楼上的耐心讲解
2007-1-17 02:44
0
游客
登录 | 注册 方可回帖
返回
//