何时使用指针,何时不使用?

2022-09-01 13:53:41

我习惯于做Java编程,在编程时你永远不必考虑指针。但是,目前我正在用C++编写一个程序。在创建具有其他类成员的类时,何时应使用指针,何时不应使用指针?例如,我什么时候想这样做:

class Foo {
    Bar b;
}

与此相反:

class Foo {
    Bar* b;
}

答案 1

首先避免使用指针。

在以下情况下使用它们:

  • 你想使用Pimpl成语,或抽象工厂
  • 该实例实际上由程序的其他部分管理,而类只需要能够访问它。BarFoo
  • 您希望推迟对象的构造(即,您希望在构造创建它)。BarFoo
  • 在您的业务逻辑中,对象可能根本不存在;你也可以在Java中使用。但是,请查看boost::optional以及。Barnull
  • Bar实际上是一个基类,您需要实例是多态的。
  • 您碰巧使用的工具包更喜欢将 GUI 小部件显示为指针。示例可能包括(但肯定不限于)wxWidgetsGLUI

在上述任何一种情况下 (*),请先使用智能指针,例如 boost::shared_ptr。否则,您迟早可能会忘记解除分配内存。一旦你知道你在做什么,就要根据具体情况考虑哪种指针类型是最好的。

(*) 任何情况 – 可能除了关于 GUI 小部件的项目符号;在这种情况下,您的工具包很可能也会为您管理资源。


答案 2
class Foo {
    Bar b;
}

b 包含在 Foo 中。如果 Foo 对象结束生存期,b 也会自动结束生存期。这就是模型组成。上面的b表示对象本身,而不仅仅是像Java中的指针。因此,如果 b 超出范围,则对象将结束生存期。

class Foo {
    Bar * b;
}

此处,对象 b 指向的对象由 Foo 对象使用或引用。如果 Foo 对象结束生存期,则对象 b 指向的对象可能会继续存在,具体取决于具体情况。这可用于对聚合和一般关系进行建模。例如,该对象可以与其他 Foo 对象共享。

指针大致相当于 Java 中的引用。他们也可以指出什么都没有。如果指针指向无,则为空指针。

与指针类似的是引用。C++中的引用必须初始化,并且只能指向一个(有效)对象,并且该对象已初始化引用。因此,引用不能像Java中那样具有“无”的值。null