C ++通过引用传递给类中的指针

时间:2012-07-11 22:55:49

标签: c++

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

这是(一个释义)传递指针/地址:

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

我应该使用哪个?

4 个答案:

答案 0 :(得分:5)

一点也不重要,所以在呼叫站点看起来更自然,或者与其他代码更加一致。

好的,我可以看到有利于每个人的观点,但我不能告诉你它们在你的情况下是否重要。

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

答案 1 :(得分:1)

无论哪个,取决于您的其他程序的上下文。

两者都可以正常工作,因此更多的问题是如何使代码更清晰。

答案 2 :(得分:1)

从技术上讲,两者都是相同的传球方式,并且同样有效。 但是,在设计层面,用户如何解释这些接口,承诺的合同存在差异。这也是自我描述界面的问题。

乍一看,by-pointer版本说:item 可能指向现有对象的指针,或者可能 nullptr(可能是{{} 1}}测试指针并做出反应),而by-reference版本表明,项目必须引用现有对象(调用者必须保证,因此addItem不必测试它。)

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

答案 3 :(得分:0)

这是(你的)语法偏好的问题,因为这是一种情况,其中引用提供了一些优于指针的好处,反之亦然。我建议你使用指针,这样对于那些正在阅读客户代码(使用房间类型)的人来说,你是通过引用传递项目而不是通过值传递的。