我应该在c ++中的类中存储引用吗?

时间:2016-05-07 09:08:49

标签: c++ class pointers reference

当我学习C ++时,我被告知如果你想让多个类引用同一个对象,你应该给这两个对象指针。在Modern C ++中,我可能会将此解释为对象是unique_ptr,而类是持有非拥有的原始指针。

最近,我的工作导师建议您只在计划让商店指向不同的对象时使用指针,或者在某些时候使用null。相反,您应该在类中存储引用。

参考成员变量是我以前从未见过的事情,所以我一直在寻找有关问题的建议......这是有道理的...你说这个引用假设永远不会为null ...我想关注的是你不能/ check / for null。它必须是你班上的一个不变的......

如何使用多态性的引用?

更新: 我选择的答案很好地涵盖了我的问题,但我想我会为未来的读者澄清。我真正想要的是使用引用而不是指针作为类成员的后果的想法。我意识到这个问题的表达方式使得听起来更像是在寻找关于这个想法的意见。

4 个答案:

答案 0 :(得分:4)

  

我应该在c ++中的类中存储引用吗?

是的,为什么不呢。这个问题是IMO主要基于意见的问题,所以我的回答是基于我自己的经验。

当我不需要提供指针时,我使用成员引用,这样我限制了我的类将被错误使用的可能性。这意味着除了绑定新值,分配nullptr之外,你不能把指针引用到引用,你不能使用引用算术 - 引用中缺少那些功能。您还应该记住,引用不是对象类型,这意味着如果您将引用作为结构成员,那么它不再是POD - 即您不能在其上使用memcpy。

您还应该记住,对于具有非静态引用成员的类,编译器不会生成隐式构造函数。

对我来说,这意味着引用作为变量成员在类是某种包装器或持有者时最有用。下面是一个示例,它还显示了使用指针成员类型的替代实现。这个替代实现不会给参考实现带来额外的好处,只能引入未定义的行为。

struct auto_set_false {
   bool& var;
   auto_set_false(bool& v) : var(v) {}
   ~auto_set_false() { var = false; }
};

struct auto_set_false_ptr {
   bool* var;
   auto_set_false_ptr(bool* v) : var(v) {}
   ~auto_set_false_ptr() { *var = false; }
};

int main()
{
    // Here auto_set_false looks quite safe, asf instance will always be
    // able to safely set nval to false. Its harder (but not imposible) to 
    // produce code that would cause Undefined Bahaviour. 
    bool nval = false;
    auto_set_false asf(nval);

    bool* nval2 = new bool(true);
    auto_set_false_ptr asf2(nval2);    
    // lots of code etc. and somewhere in this code a statement like:
    delete nval2;
    // UB
}

答案 1 :(得分:1)

在类中存储引用通常不是一个好主意,因为类不能是默认构造,复制分配,移动分配,并且不能更改成员(引用不能反弹)。

这使得该课程无法获得。因此无法复制,移动或放置在大多数容器中。更灵活,更不令人惊讶的解决方案是存储指针或std :: refernce_wrapper。

答案 2 :(得分:0)

IMO引用就像指针一样。

唯一的区别在于dynamic_cast:失败的强制转换会产生带指针的空指针,并导致抛出带引用的异常。

答案 3 :(得分:0)

引用比指针要好得多,原因之一是:你不必使用空值。 引用不能为空,并且不需要检查空值是一个很大的值。

小难点是你必须在构造函数中分配引用成员。 但是您可以在以后将其更改为指向此类的成员或子类的类的对象的其他非null值。 所以它像指针一样支持继承。