C++ 指针与引用返回类型

C++ 指针与引用返回类型,c++,pointers,reference,C++,Pointers,Reference,我试图提出一个具体的理由,为什么要在引用上使用指针 作为函数的返回类型 我的推理是,如果无意中将空值返回到引用类型 无法检查它,可能导致运行时错误 int& something(int j) { int* p = 0 ; return *p; } void main() { int& i = something(5); i = 7; // run-time error } 如果我使用了指针,我可

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

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

  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;
 }
如有任何想法,将不胜感激 再说一遍

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


提前谢谢

这通常取决于您试图实现的目标,但我通常这样对待返回值:

返回指针-调用方拥有内存(和清理)


引用-被调用方拥有内存。除非被调用方同时管理,否则不要返回动态分配的点。

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

在以下情况下,可以使用指针而不是引用:

  • Null是一个有效的返回值
  • 您在函数中动态地构造了一些东西,接收者成为所有者。(在这种情况下,您可以考虑返回一个智能指针,例如:STD::UnQuyjpTR或Booo::SyrdypTr)

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

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


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

如果函数打算“始终”返回值,那么函数应该返回引用

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


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

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

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


将其与指针进行对比。指针可以为NULL,调用方必须处理NULL返回值。因此,如果你的函数不能保证它将返回一个有效的引用,而你又不想抛出异常,你就需要使用指针。

无论如何,你都不应该返回对本地内存的引用。你为什么要做这两件事呢?@Chad:没有迹象表明引用是对本地内存的。目前,该代码只是返回一个空指针。@AJG85该代码只是举例说明返回引用时可能出现的错误(显然,它是为了简单和切中要害而设计的)。问题不在于修复不正确的代码。@AJG85:问题的重点在于无意中返回“空引用”的风险是否表明指针更可取。很明显,示例函数故意做了错误的事情,只是为了说明这一点。另外,我不知道这些与我关于返回对本地内存的引用的评论有什么关系。仅对于2011年以来阅读此(>2016)的人来说,auto_ptr似乎已被弃用。“现在,unique_ptr更合适了。”andersfylling-已修复。谢谢当我提到它的时候,它已经被弃用了两个月。这里是一个空的C++引用:无效的打印值(INT&V){PrINTF(“0x%08x\n”,v);PrINTF(“%D\n”,v);}int(){int *d=0;Print值(*d);}@ MOOF程序是UB:注:特别是,空引用不能存在于一个定义良好的程序中,因为创建这样一个引用的唯一方法是将它绑定到通过取消引用空指针而获得的“对象”,这会导致未定义的行为。