对象和对象指针之间的主要区别?

时间:2011-02-18 21:18:04

标签: c++

做之间的区别是什么,

EventList temp;

EventList* temp = new EventList();

现在临时使用.访问它的变量 另一个是->

除了那个差异,还有什么?只有EventList在堆栈上时,指针才会在堆上分配。它主要是范围的东西吗?

3 个答案:

答案 0 :(得分:5)

简短摘要

堆栈上的对象EventList temp;

  • 访问速度快一点,没有derefferencing
  • 对象会在创建它们的方法结束时自动删除,因此我们不必关心它们的删除
  • 堆栈大小有限(远远超过堆)
  • 如果不复制,则无法从方法返回这些对象

堆上的对象EventList* temp = new EventList();

  • 堆是“无限制”(与堆栈相比)
  • 这些对象可以在整个应用程序中轻松共享,因为它们不会被自动检测
  • 我们必须手动删除它们,如果我们松开指针然后内存中有丢失的字节(泄漏)

答案 1 :(得分:4)

Eventlist temp在其调用范围内自动分配和释放。也就是说,当您运行以下代码时:

{
    EventList temp;
}

EventList的默认构造函数在其声明点被调用,析构函数在块的末尾被调用。

EventList *temp = new EventList();在堆上分配。您可以阅读更多相关信息here

答案 2 :(得分:0)

嗯,从这个例子来看,你所注意到的只是差异,但是当使用虚函数和继承时,你会看到差异。

例如,这里的代码与指针相同,但没有:

有指针:

#include <iostream>
using namespace std;
class Base
     {
       public:
          virtual void Create()
          {
               cout <<"Base class create function ";
          }
     };
     class Derived : public Base
     {
       public:
          void Create()
          {
              cout<<"Derived class create function ";
          }
     };
     int main()
     {
         Base  *x, *y;  
         x = new Base();
         y = new Derived();         
         x->Create();
         y->Create();
         return 0;
     }

输出: 基类创建功能 派生类创建函数

没有指示:

#include <iostream>
using namespace std;
class Base
     {
       public:
          virtual void Create()
          {
               cout <<"Base class create function ";
          }
     };
     class Derived : public Base
     {
       public:
          void Create()
          {
              cout<<"Derived class create function ";
          }
     };
     int main()
     {
         Base  x, y;  
         x.Create();
         y.Create();
         return 0;
     }

输出: 基类创建功能 基类创建函数

因此对象和虚函数存在问题。当派生应该是执行基类函数时。这是差异之一。