【问题标题】:Why do we need a pointer to a class if we can instantiate an object of it and access members of the class?如果我们可以实例化一个类的对象并访问类的成员,为什么我们需要一个指向类的指针?
【发布时间】:2011-08-27 10:46:40
【问题描述】:


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

谢谢。

【问题讨论】:

  • 你是问一般指针的用处是什么?
  • @Tejs,指向类的指针的用处。
  • 似乎在询问指向 class.type rtti 的指针?

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


【解决方案1】:

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

如果你只有一个基类而没有派生类,那么最好在堆栈上创建对象而不是指向类的指针。在后者中,您应该在指针上调用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. 类“大”,例如,实例化或复制的成本很高。在这种情况下,我们可以传递指针,而不是按需创建它们,以提高 RAM 和 CPU 的效率。
    2. 您可能不希望有多个类的实例。考虑一个记录器,它通常实现为Singleton。现在,许多人认为单例是“坏的”,但这种用法说明了有时实例化某个类的第二个副本可能会破坏某些东西的观点。因此,您需要一个指向唯一副本的指针(或引用)。
    3. 当您需要运行时 polymorphic 行为时,您几乎肯定需要一个指针(或者,最好是一个引用)。

    【讨论】:

      【解决方案3】:

      一个原因可能是性能。想象一下,您有 100 个某个类的实例。如果您不使用指针,并且想要执行诸如将这些实例从一个容器复制到另一个容器之类的操作,则会有相当多的开销,因为需要在每个容器上调用复制构造函数。但是,如果您有指向这些实例的指针,那么真正被复制的唯一内容就是使操作更快的指针。

      【讨论】:

      • 如果你需要复制对象,不管是不是指针,你仍然需要做一个深拷贝。但是,如果您需要转移所有权,这将适用,但如果您使用的是现代/即将推出的 C++,则不适用,因为移动语义会处理它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 1970-01-01
      • 2016-05-03
      • 2015-08-14
      • 2013-09-08
      • 2019-09-28
      相关资源
      最近更新 更多