指针与参考返回类型

时间:2011-10-18 21:06:12

标签: c++ pointers reference

我试图想出一个具体的推理,为什么要在引用上使用指针 作为函数的返回类型,

我的理由是,如果无意中将null值返回给引用类型 它无法检查,并可能导致运行时错误

  int& something(int j)
  {
      int* p = 0 ;  
      return *p;
  }

  void main()
  {
      int& i = something(5);
      i = 7;   // run-time error 
  }

如果我使用了指针,我可以检查它并避免错误 指针返回值将作为必须返回值的契约。

 void main()
 {
         int* i = something(5);
         if( i != null )
             *i = 7;
 }

任何想法都将不胜感激 再次,

你会用什么?为什么? 引用或指针

提前谢谢。

6 个答案:

答案 0 :(得分:20)

如果符合以下条件,您可以使用指针代替引用:

  • Null是有效的返回值
  • 您在函数中动态构建了一些内容,并且收件人成为了所有者。 (在这种情况下,您可以考虑返回一个智能指针,如std :: auto_ptr或boost :: shared_ptr。)

无论如何,您不希望返回指针或对局部变量的引用。

答案 1 :(得分:8)

参考是一种不同的思维方式。将引用视为“指向现有对象的指针”。一旦你这样做,你就会明白为什么它们不能为NULL - 对象存在并且引用指向它。

因此,如果您的函数返回对它创建的内容的引用,则需要保证它实际上确实创建了一个有效的对象。如果它没有,或者不能,那么这就是抛出异常的理由。

用指针对比。指针可以为NULL,调用者必须处理NULL返回值。因此,如果您的函数无法保证它将返回有效的引用并且您不想抛出异常,则需要使用指针。

答案 2 :(得分:2)

如果你无意中返回一个空值,那就是一个bug。您可以轻松地将检查放在something()内,如果它为空则抛出异常。

话虽如此,历史惯例是通过指针返回堆对象,即使它们被保证为非null。

答案 3 :(得分:1)

C ++引用不能为null。该错误是取消引用空指针。这是未定义的行为。

答案 4 :(得分:1)

如果您的函数旨在“始终”返回一个值,那么您的函数应该返回一个引用。

在某些情况下,由于某些特殊原因,您无法找到要返回的值,您应该抛出异常。

当您尝试返回对null或wild指针的引用时,不应该依赖于生成的运行时错误。行为未定义。任何事情都可能发生。

答案 5 :(得分:0)

它通常取决于您要完成的任务,但我通常会以这种方式处理返回值:

返回指针 - 来电者拥有内存(和清理)

参考 - Callee拥有内存。除非被调用者也管理它,否则不要返回动态分配的点。