C ++:更好地保留引用或指针?

时间:2013-05-21 09:50:16

标签: c++ pointers reference

这可能被视为一种风格问题。我有一个类来保持对另一个类的实例的引用:

class A { };

class B {
  A& ref;

public:
  explicit B(A& ref) : A(ref) { }
};

我决定使用引用而不是指针,因为ref永远不会是空指针。此外,代码看起来更好。

但是,用户不知道我是否复制A对吗?在这种情况下,我不复制,因此如果在B的实例仍然存在时销毁A,则会发生问题。如果你使用指针,那么当然也会发生同样的情况,但我觉得用户在编写代码时就会意识到没有进行复制。

对此有何看法?处理这个问题的最佳C ++方法是什么?

PS:我想到的一个解决方案就是保持指针,但是如果它指向的对象被破坏,那么首先要复制一个。这不是那么难以实现,但重点是:额外的麻烦是否值得,并且开销是否合理呢?这种自制的参考计数器是人们真正做的吗?

4 个答案:

答案 0 :(得分:3)

如果B必须只使用A的单个实例且该实例永远不会更改,则引用才有意义。因此,如果没有B的实例,则无法构造A - 您引入了紧耦合。

但是,如果您可以使B的实例独立于A,则将其设为指针 - 这将允许您根据需要稍后设置A的实例。无论如何,你必须保证A的生命周期;避免这种情况(生命时间控制)的唯一方法是使用智能指针来管理A的生命周期。

答案 1 :(得分:1)

  

我有一个类来保持对另一个类的实例的引用:

因为你的类没有私有赋值运算符,所以它应该是可复制的和可分配的,所以你的决定是错误的(你应该使用指针),或者你的类声明是不完整的。另请参阅rule of three

如果你的类要有赋值运算符(operator=),你将不得不使用指针或某种智能指针(如std::weak_ptr)。

通常,使用以下规则是有意义的:

  1. 在函数参数中,如果参数为“big”或者具有昂贵的复制构造函数,请使用referneces或pointers。
  2. 如果该参数是可选的并且可以是0 / NULL / null_ptr,则使用指针,否则使用引用。
  3. 对于“指向”某些内容的局部变量,请使用引用,除非该变量的值可以更改。
  4. 当您需要指向“某事”并且必须使用指针时,如果您不管理该对象的生命周期,则使用标准指针,否则使用智能指针(std::shared_ptr等)。
  5. 除非您的代码受到约束,否则您不应该自己致电delete,并且必须避免同时使用stl和boost。应尽可能以自动方式执行内存管理。这减少了错误的机会。
  6. 在类成员中,仅当无法以任何方式复制该类时才使用引用(例如,单例)。

答案 2 :(得分:0)

一般来说,它与指针和引用完全相同......

您说可以删除B中引用的对象A,因此有一个没有A引用对象的B对象是有效的。你不能用引用做这个,你需要空指针 - >使用指针,而不是引用

答案 3 :(得分:0)

这是我的个人规则 - 对于不会持久存在的函数参数的引用,指出持续存在的事物。然后,如果用户通过指针,他需要仔细观察生命周期。另外,如果你想复制B&B,会发生什么?如果它是参考,您将无法再进行更改。