Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我们可以实例化一个类的对象并访问该类的成员,为什么我们需要一个指向该类的指针?_C++_Oop_Class_Visual C++_Pointers - Fatal编程技术网

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

C++ 如果我们可以实例化一个类的对象并访问该类的成员,为什么我们需要一个指向该类的指针?,c++,oop,class,visual-c++,pointers,C++,Oop,Class,Visual C++,Pointers,我在这里有点困惑。如果我们可以实例化一个类的对象并访问成员方法,那么为什么要使用指向类的指针呢?这有什么好处吗?我们什么时候使用指向类的指针,什么时候实例化类的对象 多谢各位 如果我们可以实例化一个类的对象并访问成员方法,那么为什么要使用指向类的指针呢 如果您只有一个基类而没有派生类,那么最好在堆栈上创建对象,而不是指向该类的指针。在后者中,您应该在指针上调用delete,以返回new获取的资源。(还要确保堆栈永远不会溢出。如果需要大量实例数组,那么使用new实例化是唯一的选项。) 这有什么好处


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

多谢各位

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

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

这有什么好处吗

因为它只适用于指针/引用

我们什么时候使用指向类的指针,什么时候实例化类的对象


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

您可能不需要指向类的指针。如果您的类很小,没有通过基类表现出多态性行为,或者没有任何成本进行实例化,那么您可能只需要在运行中撕下一个就可以了

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

  • 该类是“大的”,如中所示,实例化或制作副本的成本很高。在这种情况下,为了提高RAM和CPU的效率,我们可以传递指针,而不是根据需要创建指针
  • 您可能不希望一个类有多个实例。考虑一个记录器,它经常被实现为。现在很多人认为单例是“不好的”,但这种用法说明了一点,有时实例化某个类的第二个副本可能会破坏某些东西。因此,您需要指向唯一副本的指针(或引用)
  • 当您想要运行时行为时,几乎可以肯定您想要一个指针(或者,最好是一个引用)

  • 一个原因可能是性能。假设您有100个某个类的实例。如果您不使用指针,并且希望将这些实例从一个容器复制到另一个容器,那么会有相当大的开销,因为需要对每个容器调用复制构造函数。然而,如果你有指向这些实例的指针,那么唯一真正被复制的就是指针,它使操作更快。

    你是在问指针的用处是什么吗?@Tejs,指向类的指针的有用性。的可能副本似乎在询问指向类的指针。类型rtti?如果需要复制对象,不管它们是否为指针,仍然需要进行深度复制。但是,如果需要转移所有权,这将是适用的,但如果使用现代/即将到来的C++,则不适用,因为移动语义将负责它。
    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.