繁体   English   中英

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

[英]Why do we need a pointer to a class if we can instantiate an object of it and access members of the class?


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

谢谢。

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

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

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

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

如果你只有一个基类而没有派生类,那么最好在堆栈上创建对象而不是指向类的指针。 在后者中,您应该在指针上调用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.

它有什么好处吗?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM