在学习C ++时,有人告诉我,如果要让多个类引用同一个对象,则应同时提供一个指向该对象的指针。在Modern C ++中,我可能会将其解释为对象是unique_ptr,并且该类包含非所有者原始指针。
最近,我的指导者在工作中建议您仅在计划将存储指向另一个对象或在某个时候将其设置为null时才应使用指针。相反,您应该将引用存储在类中。
引用成员变量是我实际上从未见过的事情,因此我一直在寻找有关所关注问题的建议...这是有道理的...您是说该引用假定永远不会为空...我想这可能是因为您不能/ check /为null。它必须是您的班级的不变式...
如何将引用用于多态性呢?
更新:我选择的答案很好地涵盖了我的问题,但我想为以后的读者澄清一下。我真正要寻找的是关于使用引用而不是指针作为类成员的后果的想法。我意识到问题的表达方式听起来更像是我在寻求有关此想法的意见。
我应该在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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句