作为成员的指针或作为成员的引用

Pointer as member or Reference as member

本文关键字:成员 引用 指针      更新时间:2023-10-16

我需要一个关于c++linux的说明。

我有class C1和另一个class C2C1将具有C2的参考。

class C1
{
   C2 &obj ;
}

,我在想两个选择

  1. C2的引用直接保存为C2 &obj;
  2. 创建C2的指针,作为c2* obj;

哪一个好?它有什么区别?什么时候选择?

尽可能避免使用引用成员。

与引用和指针的区别相同,
如果您有引用成员,则必须在创建类对象时对其进行初始化。您不能像指针成员那样进行延迟初始化,因为引用不能为NULL并且不能重新定位,而指针成员可以在需要时延迟指向C2实例。

此外,请注意还有其他副作用,一旦有了引用成员,编译器就不会生成复制赋值运算符(=)&你必须自己提供一个,在这种情况下,你的=操作员应该采取什么行动是很难确定的。

对于大多数实际用途(除非您真的担心由于C2大小而导致的高内存使用率),仅将C2的实例作为C1的成员(而不是指针或引用成员)就足够了,这可以省去您对引用/指针成员带来的其他问题的大量担忧,尽管这是以额外的内存使用为代价的。

如果必须使用指针,请确保使用智能指针而不是原始指针,这将使您的指针生活更轻松。

指针对引用有两个主要优势。指针可以为null,并且可以移动指针(例如使用++运算符)。搬家对你没有帮助。如果在实例化C1时类C2未知,则应该使用指针,因为您无法初始化引用,但指针可以初始化为null。

正如Als所说,当C2实例可能发生变化时,我也建议使用指针。在这种情况下,您可以使用引用,但我认为指针是一个"更干净"的解决方案。

您将使用哪一个,取决于您到底需要什么。

例如,如果需要某种依赖注入,可以使用引用成员变量。即便如此,您也可以使用指针。但是,请记住,具有引用成员的类通常应该是不可复制的。

在大多数情况下,您应该使用指针或值成员变量。

两者都不好。如果有任何指针引用成员变量指向类外分配的内容,则很可能意味着程序设计存在某种缺陷。

我可以想出一个合理的例子,当你有某种特殊的外部垃圾收集器功能时。(例如C++Builder对堆上VCL组件的自动分配/解除分配。)

另一种情况是它可能是有效的,当你用C++类模拟一个C结构时,或者当你在另一个类中写一个私有类时。

但最有可能的是,需要指出课堂之外的东西来自于有缺陷的程序设计。我会再三考虑为什么我的代码需要这样做,并且至少尝试向指针添加尽可能多的常量正确性,即const *c2 const obj;

如果您有类似这样的特殊成员指针,您还必须为类手动编写一个复制构造函数、赋值运算符和析构函数。

编辑:这是一种糟糕做法的基本原理是称为私有封装的概念,它是称为面向对象设计的程序设计概念的基石之一。