【问题标题】:Return array of pointers by reference通过引用返回指针数组
【发布时间】:2017-05-07 20:05:54
【问题描述】:

在我的一门课中,我有一个

Reservation * availability[30] = {nullptr};

(当然我稍后会用一些值初始化)。

尽管如此,我有一个 getReservations() 函数,它应该返回对包含 30 个元素的数组的引用,因此可以像这样使用它:

getReservations()[i] ...

我应该如何声明该函数?

【问题讨论】:

  • 旁注:我会亲自使用= {}; 初始化数组。看起来您认为所有元素都已初始化为您编写的 nullptr,但它们实际上是值初始化的。
  • @Quentin 好吧,值初始化和 nullptr 初始化做同样的事情,不是吗?不过我同意,以不同的方式对待第一个元素是愚蠢的。
  • @user2079303 是的,这就是我的观点。没有功能上的区别,但有点误导。
  • @Quentin 我的观点是,当它导致相同的结果而没有区别时,真的是 误导 吗?在我看来这很愚蠢。

标签: c++ c arrays pointers


【解决方案1】:

声明一个通过引用返回数组的函数的语法如下:

Reservation * (& getReservations())[30];

当然,如您所见,您不应该在现实生活中使用它。而是使用类型别名:

using Reservations = Reservation * [30];

Reservations & getReservations();

或者,因为数组没有边界检查,所以只返回一个指针,然后你可以像数组一样索引它:

Reservation * getReservations();

【讨论】:

    【解决方案2】:
    Reservation *(&getReservations())[30];
    

    应该为你做。

    请记住悬空引用和指针管理。

    【讨论】:

      【解决方案3】:

      我建议你使用现代 C++:

      using ReservationArray = std::array<Reservation*, 30>;
      
      ReservationArray _availability;
      

      并将其返回为:

      ReservationArray& getReservations()
      

      【讨论】:

      • 原始指针在现代 C++ 中仍然难以置信有用。不要将“指针”误认为“拥有动态值”。这些是正交概念。
      • 是的,它们在某些特定情况下很有用。但是为什么你会推荐在这里使用原始指针呢?
      • 您做出了(未经证实的)假设,即这些指针拥有数据。如果他们不拥有,那么unique_ptr 会导致双重删除未定义行为,这是非常非常糟糕的。这些指针很可能是可为空的引用,在这种情况下,Reservation* 是正确的使用方法。
      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 2021-12-23
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多