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

Dav*_*rol 5 c++ pointers reference class

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

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

参考成员变量是我以前从未见过的事情,所以我一直在寻找有关问题的建议......这是有意义的......你说这个参考被认为永远不会是空的......我想关注的是你不能/ check/for null.它必须是你班级的不变量......

如何使用多态性的引用?


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

mar*_*inj 4

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

是的,为什么不。在我看来,这个问题“主要基于意见”,所以我的回答是基于我自己的经验。

当我不需要指针提供的内容时,我使用成员引用,这样我就限制了我的类被错误使用的可能性。这意味着绑定新值、分配 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
}
Run Code Online (Sandbox Code Playgroud)