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

时间:2012-03-05 07:37:50

标签: c++

我需要在c ++ linux中进行一次澄清。

我有class C1和另一个class C2C1将引用C2

class C1
{

   C2 &obj ;

}

我在考虑两个选择,

  1. 直接将C2的引用保留为C2 &obj;
  2. 创建C2的指针,为c2* obj;
  3. 哪个好?它有什么区别?何时选择?

4 个答案:

答案 0 :(得分:3)

尽量避免使用引用成员。

与引用和指针的差异在这里适用,
如果你有一个引用成员,那么在创建类对象时必须被初始化你不能像指针成员那样进行延迟初始化,因为引用不能为NULL并且不能重新安装,而可以使指针成员在需要时懒惰地指向C2实例。

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

对于大多数实际用途(除非您真的担心由于C2大小导致的高内存使用率),只需将C2的实例作为C1的成员保留即可,而不是指针或引用成员,这可以节省你对引用/指针成员带来的其他问题的担忧,但是会牺牲额外的内存使用量。

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

答案 1 :(得分:0)

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

就像Als所说,我也建议在C2实例可能改变时使用指针。你可以在这种情况下使用引用,但我认为指针是一个“更清洁”的解决方案。

答案 2 :(得分:0)

两者都不好。如果你有任何指针引用成员变量指向你班级之外分配的东西,那么很可能意味着程序设计在某种程度上存在缺陷。

我可以提出一个合理的案例,就是当你拥有某种特殊的外部垃圾收集器功能时。 (例如,C ++ Builder在堆上自动分配/释放VCL组件。)

另一种情况是它可能有效,是在用C ++类模拟C结构时,还是在另一个类中编写私有类时。

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

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

编辑:为什么这是不良做法的理由是名为private encapsulation的概念,这是名为object-oriented design的程序设计概念的基石之一。

答案 3 :(得分:0)

您将使用哪一种,取决于您的确切需要。

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

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