繁体   English   中英

指针与引用返回类型

[英]Pointer vs. reference return types

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

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

  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;
 }

任何想法都会再次受到赞赏,

你会使用什么以及为什么引用或指针

提前致谢。

如果出现以下情况,您可以使用指针而不是引用:

  • Null 是有效的返回值
  • 您在函数中动态构建了一些东西,接收者成为所有者。 (在这种情况下,您可能会考虑返回一个智能指针,例如 std::unique_ptr 或 boost::shared_ptr。)

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

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

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

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

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

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

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

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

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

当您尝试返回对空指针或野指针的引用时,您不应依赖会产生运行时错误。 行为未定义。 什么事情都可能发生。

它通常取决于您要完成的任务,但我通常这样处理返回值:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM