【问题标题】:Why does this C++ data member declaration contain an ampersand? [duplicate]为什么这个 C++ 数据成员声明包含一个 & 符号? [复制]
【发布时间】:2020-12-17 19:13:06
【问题描述】:

我是一个新手,试图理解开源游戏 Simutrans 中的一些 C++ 代码。具体来说,这个声明(this header file 中的第 79 行):

class env_t
{
public:
                     <snip>
/// if we are the server, we are at this port
    /// @see network_init_server()
    static const uint16 &server;

上下文告诉我们这一行涉及env_t 类的公共数据成员。 static 关键字告诉我们 env_t 类的所有对象都将具有属性 server

Server的类型是uint16(一个16位无符号整数),它是一个constant(所以在正常情况下不能被覆盖)。

让我感到困惑的部分是为什么在成员名称的开头有一个 & 符号。我以前只在按位算术和“地址”运算符中遇到过与号。这两种用法都不适合这里:没有算术,我看不出如何将 server 定义为 server 的地址。这不是告诉程序变量的唯一可能值是变量自己的内存地址吗?这不仅看起来是循环的,而且似乎与程序绝对可以将超过 16 位的内存地址用于其他目的这一事实不一致。

很难搜索解释,因为 & 号也是搜索运算符。但是this article 在 C++ 中给出了七种与符号的不同用法,但它们似乎都不适合这里。它不是一个表达式,也不是一个双&。根据these S.O. answers,可以在函数模板中使用与号来指示参数必须是引用类型。但我的示例是声明一个数据成员,它不是模板,实际上也不是任何类型的函数。而且类型显然是 uint16,对吧?那么这里的 & 符号是什么意思呢?

需要注意的是,Simutrans 已有 20 多年的历史,在所有平台都有标准库之前,所以它的代码有时是特殊的。但我确信更相关的事实是我是 C++ 的初学者!

【问题讨论】:

  • 这一行也很重要:github.com/aburch/simutrans/blob/…
  • 如您所见,谷歌搜索常见的 C++ 语法很困难。一般来说,Internet 不是学习 C++ 的好地方,因为坏信息与好信息的比率如此之高,以至于当您在不知道大部分您要查找的内容的情况下偶然发现好信息时,这可不是运气。在你的 C++ 职业生涯的这个阶段,你想要的是a good textbook and maybe a few good language references。它们将大大提高您理解语言的速度。
  • 不,在类定义中,static not 是否意味着所有对象都具有成员 server。实际上,这意味着没有对象拥有该成员,而是有一个名为env_t::server的全局变量。
  • @para 你漏掉了几个词:“必须做的是阅读和理解几个段落”理解是棘手的部分,通常只能完成当它所构建的材料也被理解时。

标签: c++ public class-members


【解决方案1】:

该符号表示server 是一个引用。这与指针有足够的相似之处,如果您对它们感到满意,您可以将它们视为非常受限的指针。如果您对指针不太满意,那么引用不是保存自己数据的变量。相反,它是对另一个变量的引用。这种表示法表明 server 实际上是指其他地方的数据,很可能在您的 env_t 类之外。

这样做通常有两个原因。一个是如果你改变这个值,它会改变被引用的实际变量的值,这样如果另一段代码查看它的值,他们就会看到你的改变。反之亦然,如果其他人更改了server 引用的变量的值,而您查询server 的值,您将看到他们的更改。

【讨论】:

  • 描述引用的常用方法是作为现有变量的替代名称、别名。
猜你喜欢
  • 1970-01-01
  • 2013-04-24
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
相关资源
最近更新 更多