【问题标题】:How to specify a const reference to a const pointer?如何指定对 const 指针的 const 引用?
【发布时间】:2012-01-17 18:35:14
【问题描述】:

可能是我的一个概念错误,但假设我有一个函数,它以 char * 作为参数;也就是一个 C 风格的字符串。但我想确保char * 指向某些东西。那么我可以使用类似的东西吗:

foo(const char * const &cstring)

指定我期望cstringconstconst char * 的引用? 这样我就不需要检查 foo 中的 NULL 指针。

【问题讨论】:

  • 第一步应该尝试你正在尝试的东西,看看它是否有效。
  • FTR、C 和 C++ 不是同一种语言。
  • 是的,一个合理的问题。在我学习 C++ 的早期,我也想这样做,那时我认为我应该一直使用指针来处理字符串。 是你犯的概念错误。与其定义一个接受任何类型 char * 的函数,不如定义一个接受 std::string 引用的函数。

标签: c++ pointers reference constants


【解决方案1】:

您所写的内容确保引用本身绑定到一个可能仍然为空的有效指针。没有任何编译时方法可以做你想做的事。

最好的选择是不使用 C 字符串,而是通过值或 const 引用获取 std::string。如果这不合适,则使用const char*,将不接受 null 的函数文档放入,并执行运行时断言指针不为 null。

【讨论】:

  • 非常感谢。是的,我会这样做。我认为这个答案是最完整的。
【解决方案2】:

这不会阻止您获取 NULL 指针...您正在获取对指针的引用...这意味着机器上的引用参数表示的内存地址(或寄存器)中的值-代码级别将是指针的地址,而不是指针值本身。因此,指针仍然可以分配一个 NULL 值。

因此,虽然参数本身可能不是 NULL(如果参数是指针,也可能是),指针指向的值可能是 NULL,因此您仍然需要检查 NULL 指针。

【讨论】:

    【解决方案3】:

    您将 const 引用传递给 C 字符串,但这将保证 cstring 本身包含 NULL。您仍然需要在foo 中手动检查cstring == NULL。就像int const& 不会打扰您传递 0。

    【讨论】:

      【解决方案4】:

      引用等同于T* const ptr_name

      第二件事是我会说你总是要检查空指针。

      【讨论】:

      • 引用绝对等同于T* const name。也许这是与引用最相似的指针类型,但说它们是等价的却是一个严重的错误陈述。当然,使用引用,您不必检查空指针。这就是提问者的目标。
      • 好的,我猜你是说引用不能为空,因为它们必须在声明时初始化(如果我错了请纠正我),另一方面我们不能忘记这样情况:int p = NULL; int& r = *p,在这种情况下,引用为空,程序编译并运行没有问题(刚刚检查过),直到我们想要使用这样的引用。就“等效性”而言,当然 T const name 与 reference 不同,但是它们的行为方式与函数参数相似,指针和 ref 之间的其他区别。仍然成立。
      • 当然,和其他人一样,我想了解更多,所以如果我错了,请解释一下原因。
      猜你喜欢
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      相关资源
      最近更新 更多