C++通过类中的引用与指针进行传递
C++ Pass by reference vs. pointer in a Class
所以,我有一个类,它存储指向对象的指针向量。我有一个将对象添加到向量中的方法。在添加时,我知道我可以通过引用或指针传递,并且已经阅读了每种方法的优点和缺点,但在这种情况下,我不知道哪一种更好以及为什么。据我所知,它们几乎是一样的(但我可能错了!)
以下是(转述)经过指针/地址:
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)的人来说,您通过引用而不是通过值传递项目是显而易见的。
相关文章:
- 如何使用基类指针引用派生类成员
- 将常量指针引用绑定到非常量指针
- 如果非动态变量被指针引用,何时超出范围?
- 转换指针引用的字符串
- 指针引用的生存期(以 C++为单位)
- 从 unique_ptr::get 发送指针作为指针引用进入函数
- 指针/引用的 CLion 格式
- 使用模板专用化来比较指针引用
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- C++初始化指针/引用/复制细微差别
- 用数组或指针引用函数?
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 强制转换为指针引用是否会导致未定义的行为
- 访问由 void 指针引用的结构的成员
- C 为什么当先前的步骤引发异常时,std :: shared_ptr的指针引用会被破坏
- 动态指针引用数组由三元运算符返回值,但有异常
- 悬空指向 int 和 char* 常量的指针/引用
- C++ 二维数组和指针引用
- 通过使用指针/引用,在C++中使用向量加快计算速度
- C++非类型模板模板到函数指针/引用