C++通过类中的引用与指针进行传递

C++ Pass by reference vs. pointer in a Class

本文关键字:指针 引用 C++      更新时间:2023-10-16

所以,我有一个类,它存储指向对象的指针向量。我有一个将对象添加到向量中的方法。在添加时,我知道我可以通过引用或指针传递,并且已经阅读了每种方法的优点和缺点,但在这种情况下,我不知道哪一种更好以及为什么。据我所知,它们几乎是一样的(但我可能错了!)

以下是(转述)经过指针/地址:

hpp:
class Room {
    vector<Item*> items;
public:
    void addItem(Item*);
};
cpp:
void Room :: addItem(Item* item) {
    items.push_back(item);
}

并通过参考:

hpp:
class Room {
    vector<Item*> items;
public:
    void addItem(Item &);
};
cpp:
void Room :: addItem(Item &item) {
    items.push_back(&item);
}

我应该用哪个?

这一点都不重要,所以在调用站点上做任何看起来更自然的事情,或者与代码的其余部分更一致。

好吧,我可以看到每一点都是有利的,但我不能告诉你它们对你的情况是否重要。

  • 传递指针更准确地反映了如何使用参数(尽管我不知道这是有用的语义信息还是实现细节)
    • 传递指针(或直接传递new的结果)的调用站点看起来很自然
    • 一个调用站点做一些愚蠢的事情,比如传递一个自动变量的地址,会很突出
  • 通过引用传递表明参数不应该是NULL,这可能是正确的,也可能不是有用的

根据程序其余部分的上下文选择哪一个。

两者都能很好地工作,所以问题更多的是哪一个能让代码更清晰。

从技术上讲,两者都是等效的传递方式,效果同样好。然而,在设计层面,用户如何解释这些界面,以及承诺签订什么合同,都存在差异。这也是一个自我描述接口的问题。

乍一看,按指针版本表示:项可能是指向现有对象的指针,也可能是nullptr(很可能,addItem确实测试了指针并做出了反应),而按引用版本表示,项<strong]必须>引用现有对象(调用方必须保证这一点,因此addItem不必测试它)。

简单地说,选择语法也是一个明确无误地表达意图的问题。

这是(您)在语法上的偏好问题,因为这是而不是引用比指针提供一些好处的情况,反之亦然。我建议您使用指针,这样对于正在阅读客户端代码(使用Room Type)的人来说,您通过引用而不是通过值传递项目是显而易见的。