我来自Java背景,已经开始使用C++中的对象。但我想到的一件事是,人们经常使用指向对象的指针,而不是对象本身,例如这样的声明:

Object *myObject = new Object;

而不是:

Object myObject;

或者不用函数,让我们说testFunc(),如下所示:

myObject.testFunc();

我们必须写下:

myObject->testFunc();

但我不明白我们为什么要这样做。我认为这与效率和速度有关,因为我们可以直接访问内存地址。我说得对吗?


当前回答

C++中对象指针的关键优势是允许同一超类的指针的多态数组和映射。例如,它允许将长尾鹦鹉、鸡、知更鸟、鸵鸟等放在鸟的阵列中。

此外,动态分配的对象更灵活,可以使用HEAP内存,而本地分配的对象将使用STACK内存,除非它是静态的。堆栈上有大型对象,尤其是使用递归时,无疑会导致堆栈溢出。

其他回答

指针直接引用对象的内存位置。Java没有这样的东西。Java具有通过哈希表引用对象位置的引用。使用这些引用,您无法在Java中执行类似指针算术的操作。

回答你的问题,这只是你的喜好。我更喜欢使用类似Java的语法。

在C++中,堆栈上分配的对象(使用Object对象;块内的语句)将只存在于声明的范围内。当代码块完成执行时,声明的对象将被销毁。而如果使用Object*obj=new Object()在堆上分配内存,则它们将继续驻留在堆中,直到调用delete obj。

如果我想在堆上创建一个对象,而不仅仅是在声明/分配该对象的代码块中使用该对象。

已经有很多很好的答案,但让我举一个例子:

我有一个简单的Item类:

 class Item
    {
    public: 
      std::string name;
      int weight;
      int price;
    };

我做了一个向量来容纳它们。

std::vector<Item>库存;

我创建了一百万个Item对象,并将它们推回到向量上。我按名称对向量进行排序,然后对特定项目名称进行简单的迭代二进制搜索。我测试了程序,完成执行需要8分钟。然后我改变我的库存向量如下:

std::vector<Item*>库存;

…并通过新建创建我的百万Item对象。我对代码所做的唯一更改是使用指向Items的指针,除了最后为清理内存而添加的循环。该程序运行时间不到40秒,或者比速度提高10倍还要快。编辑:代码位于http://pastebin.com/DK24SPeW通过编译器优化,在我刚刚测试过的机器上,它只增加了3.4倍,这仍然很可观。

Object *myObject = new Object;

这样做将创建对对象(堆上)的引用,必须显式删除该对象以避免内存泄漏。

Object myObject;

这样做将创建一个自动类型的对象(myObject)(在堆栈上),当对象(myObject)超出范围时,该对象将被自动删除。

“需要是发明之母。”我想指出的最重要的区别是我自己编码经验的结果。有时需要将对象传递给函数。在这种情况下,如果您的对象是一个非常大的类,那么将其作为对象传递将复制其状态(您可能不希望..AND可以是big OVERHEAD),从而导致复制对象的开销。而指针是固定的4字节大小(假设为32位)。上面已经提到了其他原因。。。