C ++复古新手:地址参考

时间:2015-02-22 15:31:58

标签: c++ pointers null

所以,在从C ++工作了20年之后,我又回到了它。我为我的生活无法绕过这个问题。我正在使用[在工作]类,我传递地址引用,而不是指针引用。下面这个小foo()示例,为什么我不能返回NULL或nullptr?我违反了什么规则我忘记了?

int& foo(int &i)
{
  if (i > 10)
  {
    // or return nullptr;
    return NULL;
  }
  return i;
}

5 个答案:

答案 0 :(得分:1)

  

为什么我不能返回NULL或nullptr?

因为您已声明函数将引用返回到int。参考文献必须始终"指向"到存在的实际int。因此nullptr不是有效值。 (空指针不能转换为对int的引用,它只能转换为指针到int。)

解决方案1:

声明函数返回指向int的指针:

int* foo(int &i)
{
  if (i > 10)
  {
    return nullptr; // or NULL, or 0. (Since NULL is a macro expanding to `0` or `nullptr` anyway.)
  }
  return &i; // Return the address of i, aka a pointer to i.
}

解决方案2:

声明一个与返回null值在语义上相同的int值。

int& foo(int &i)
{
  static int nullValue = 0;
  if (i > 10)
  {
    // or return nullptr;
    return nullValue;
  }
  return i;
}

现在每次i > 10为真,函数都会返回对静态局部变量的引用,该变量等于0(如果需要,可以更改实际值)。

当然,如果return i返回与nullValue相同的值,那么函数调用者无法知道函数是否返回了对nullValue或某些实际的引用价值i

答案 1 :(得分:1)

没有"地址引用"。有"引用",它们与指针不同。 C ++引用是许多其他语言(例如C或Java)中缺少的非常强大的语言特性。

最好将参考图描绘为现有对象的不同名称。或者更好的是,作为对象本身。 参考是对象。

那根本不像指针。指针本身就是一个对象恰好指向别的东西(或者什么都没有)。

  

他们出于性能原因这样做。

不,他们不是。如果他们这样说,那就没有意义了。你没有使用引用来表现性能(至少不是非const引用),你可以使用它们来表示正确性。

int& foo(int &i)
{
  if (i > 10)
  {
    // or return nullptr;
    return NULL;
  }
  return i;
}

没有" null引用"这样的东西。请记住,引用是对象。那么你的foo函数返回的实际上就是对象本身。不是指向它的指针,不是它的地址,而是对象本身。

NULLnullptr会是什么对象?它没有意义。不可能有任何对象。

如果你需要能够有一个特殊的"什么都没有"在您的业务逻辑中陈述,然后您可以使用boost::optional之类的东西。或者,或许你真的想要一个指针,毕竟。这取决于。

  

而不是指针引用。

存在指针引用,但它们与您的示例无关。

这是一个指针引用:

int main()
{
    int x = 0;
    int* ptr = &x;
    int*& y = ptr; // "y" is now a different name for "ptr"
}

答案 2 :(得分:1)

你可能find this回答有见地。

简答:在C ++中,引用永远不能是NULL(或NULL的任何版本nullptr,因为它必须始终是安全的-reference。

答案 3 :(得分:0)

在C ++中,NULL是实现定义的,但通常只是整数:

#define NULL 0

#define NULL nullptr //自C ++ 11以来

在这两种情况下,错误都是类型不匹配:

error: invalid initialization of non-const reference of type 'int&'
       from an rvalue of type 'int'
       #define NULL 0
                    ^

答案 4 :(得分:0)

不允许空引用 - "引用应初始化以引用有效的对象或函数。 [注意:特别是,在一个定义良好的程序中不能存在空引用,因为创建这样一个引用的唯一方法是将它绑定到通过解除引用空指针获得的“对象”,这会导致未定义的行为。如9.6中所述,引用不能直接绑定到位域。 ]&#34 ;.资料来源:http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29