C++ C++;类中的按引用传递与指针传递

C++ C++;类中的按引用传递与指针传递,c++,C++,我有一个类,它存储指向对象的指针向量。我有一个方法可以将对象添加到向量中。当添加时,我知道我可以通过引用或指针进行传递,并且已经阅读了每种方法的优缺点,但是在这种情况下,我不知道哪种方法更好以及为什么。据我所知,它们几乎是一样的(但我可能错了!) 以下是指针/地址传递的(意译): hpp: class Room { vector<Item*> items; public: void addItem(Item*); }; cpp: void Room :: addIt

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

以下是指针/地址传递的(意译):

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

cpp:
void Room :: addItem(Item* item) {
    items.push_back(item);
}
hpp:
教室{
向量项;
公众:
无效附加项(项目*);
};
cpp:
空房间::附加项(项*项){
项目。推回(项目);
}
…并通过引用传递:

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

cpp:
void Room :: addItem(Item &item) {
    items.push_back(&item);
}
hpp:
教室{
向量项;
公众:
无效附加项(项目&);
};
cpp:
无效房间::附加项(项目和项目){
项目。推回(&item);
}

我应该使用哪一种?

以哪一种为准,具体取决于您课程其余部分的内容


两者都可以很好地工作,所以更重要的问题是哪一个可以使代码更清晰。

这是(您)在语法上的偏好问题,因为在这种情况下,引用不会比指针提供一些好处,反之亦然。我建议您使用指针,以便阅读客户机代码(使用房间类型)的人立即清楚地看到,您是通过引用传递项目,而不是通过值传递项目。

这一点都不重要,所以在调用站点执行任何看起来更自然或与代码其余部分更一致的操作

好的,我可以看到对每一点都有利的观点,但我不能告诉你它们是否对你的情况有影响

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

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

乍一看,按指针版本显示:项可能是指向现有对象的指针,或者它可能是
nullptr
(很可能,
addItem
会测试指针并作出反应),而按引用版本显示,项必须指向现有对象(调用者必须保证,
addItem
不必测试它)


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

将空指针传递到
addItem
是否有效?我的首选是两者都不传递,而是使用
unique\u ptr
shared\u ptr
使所有权语义更清晰。-1因为通过指针传递不是通过引用。传递指针是按值传递。按引用传递意味着函数中有相同的对象。如果直接传递指针,它指向相同的位置,但不是相同的指针。创建了指针的副本。我明白了他/她的意思。Cheers=)同意。按值传递指针。但是你是通过引用传递指向对象。关于“通过引用传递”的真正含义有很多混淆,我认为根据语言的不同,定义是不同的。我建议大家阅读C++定义的概要。+ 1,重要的一点是答案取决于预期的语义。谢谢,先生/女士。你的用户名是没有根据的^_^