这是一个简单的例子来说明问题:
class A {};
class B
{
B(A& a) : a(a) {}
A& a;
};
class C
{
C() : b(a) {}
A a;
B b;
};
所以 B 负责更新 C 的一部分。我通过 lint 运行代码,它提示引用成员:lint#1725 . 这谈到了照顾默认拷贝和分配这很公平,但是默认拷贝和分配对于指针也很糟糕,所以那里几乎没有优势。
我总是尽量使用引用,因为裸指针不确定谁负责删除该指针。我更喜欢按值嵌入对象,但如果需要指针,我会在拥有指针的类的成员数据中使用 auto_ptr,并将对象作为引用传递。
我通常只会在指针可能为空或可能更改时在成员数据中使用指针。还有其他理由更喜欢指针而不是数据成员的引用吗?
说一个包含引用的对象不应该是可分配的,因为引用一旦初始化就不应更改,这是真的吗?
最佳答案
我自己的经验法则:
- 当您希望对象的生命依赖于其他对象的生命时,请使用引用成员:这是一种明确的方式,表示您不允许对象在没有生命的情况下仍然存在另一个类的有效实例 - 因为没有赋值和通过构造函数获取引用初始化的义务。 这是一种设计类的好方法,无需假设它的实例是否属于另一个类。您只需假设它们的生活与其他实例直接相关。它允许您稍后更改您使用类实例的方式(使用新的、作为本地实例、作为类成员、由管理器中的内存池生成等)
- 在其他情况下使用指针:当您希望稍后更改成员时,请使用指针或 const 指针以确保仅读取指向的实例。 如果该类型应该是可复制的,则无论如何您都不能使用引用。 有时您还需要在特殊函数调用(例如 init() )之后初始化成员,然后您别无选择,只能使用指针。 但是:在所有成员函数中使用断言来快速检测错误的指针状态!
- 如果您希望对象生命周期依赖于外部对象的生命周期,并且您还需要该类型是可复制的,则在构造函数中使用指针成员但引用参数在构造上表明该对象的生命周期取决于参数的生命周期,但实现使用指针仍然是可复制的。只要这些成员仅通过拷贝进行更改,并且您的类型没有默认构造函数,该类型就应该满足这两个目标。
关于c++ - 我应该更喜欢成员数据中的指针还是引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/892133/