【发布时间】: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++ 的初学者!
【问题讨论】:
-
如您所见,谷歌搜索常见的 C++ 语法很困难。一般来说,Internet 不是学习 C++ 的好地方,因为坏信息与好信息的比率如此之高,以至于当您在不知道大部分您要查找的内容的情况下偶然发现好信息时,这可不是运气。在你的 C++ 职业生涯的这个阶段,你想要的是a good textbook and maybe a few good language references。它们将大大提高您理解语言的速度。
-
不,在类定义中,
staticnot 是否意味着所有对象都具有成员server。实际上,这意味着没有对象拥有该成员,而是有一个名为env_t::server的全局变量。 -
@para 你漏掉了几个词:“必须做的是阅读和理解几个段落”理解是棘手的部分,通常只能完成当它所构建的材料也被理解时。
标签: c++ public class-members