如果我们可以实例化一个对象并访问该类的成员,为什么我们需要一个指向类的指针?

inf*_*oop 3 c++ oop pointers class visual-c++


我在这里有点困惑.如果我们可以实例化一个类的对象并访问成员方法那么为什么指向一个类的指针?它有什么好处吗?我们何时使用指向类的指针,何时实例化它的对象?

谢谢.

Joh*_*ing 10

您可能不需要指向类的指针.如果你的类很小,没有通过基类表现出多态行为,或者需要花费任何实例化的东西,你可能只需要动态地删除一个并完成.

但在许多情况下,我们需要指针,因为:

  1. 这个类是"大",因为实例化或复制是昂贵的.在这种情况下,我们可以传递指针而不是仅仅根据需要创建指针,以便更有效地使用RAM和CPU.
  2. 您可能不希望那里有多个类的实例.考虑一个记录器,它通常被实现为Singleton.根据许多人的说法,单身人士现在很"糟糕",但这种用法说明了有时候实例化某个类的第二个副本可能会破坏某些东西.因此,您需要一个指向唯一副本的指针(或引用).
  3. 当你想要运行时多态行为时,你几乎肯定需要一个指针(或者,最好是一个引用).


Mah*_*esh 7

如果我们可以实例化一个类的对象并访问成员方法那么为什么指向一个类的指针?

如果你只有一个基类而没有派生类,那么最好在堆栈上创建对象而不是指向类的指针.在后者中,您应该调用delete指针来返回获取的资源new.(还要确保堆栈永远不会溢出.如果需要大量的实例数组,那么实例化使用new是唯一的选择.)

class foo
{
    int a ;
};

foo obj1 ;
foo obj2 = obj1 ; // Copy construction. Both obj2, obj1 have it's independent
                  // copy of objects. (Deep copy)

foo *obj3 = new foo ;
foo *obj4 = obj3 ; // Copy construction. However, both obj3, obj4 point to the 
                   // same object. (Shallow copy)

                   // You should be careful in this case because deletion of obj3
                   // makes obj4 dangling and vice versa.
Run Code Online (Sandbox Code Playgroud)

它有什么好处吗?

多态性因为它仅适用于指针/引用.

我们何时使用指向类的指针,何时实例化它的对象?

这取决于要求.如前所述,如果你只有一个基类创建堆栈上的对象是一个更好的选择.