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

时间:2011-05-17 17:38:21

标签: c++ oop class visual-c++ pointers


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

谢谢。

3 个答案:

答案 0 :(得分:10)

您可能不需要指向类的指针。如果你的类很小,没有通过基类表现出多态行为,或者需要花费任何实例化的东西,那么你可以在运行中直接删除一个并完成。

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

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

答案 1 :(得分: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.
  

它有什么好处吗?

Polymorphism因为它仅适用于指针/引用。

  

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

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

答案 2 :(得分:1)

一个原因可能是表现。想象一下,你有一些类的100个实例。如果你没有使用指针而你想要做一些事情,比如将这些实例从一个容器复制到另一个容器,那么由于需要在每个容器上调用复制构造函数,所以会产生相当大的开销。但是,如果您有指向这些实例的指针,那么唯一真正被复制的是指针使操作更快。