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

Object *myObject = new Object;

而不是:

Object myObject;

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

myObject.testFunc();

我们必须写下:

myObject->testFunc();

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


当前回答

假设你有一个包含类B的类A。当你想在类A之外调用类B的某个函数时,你只需要获得一个指向这个类的指针,你可以做任何你想做的事情,它也会改变类A中类B的上下文

但要小心动态对象

其他回答

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

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

使用指向对象的指针有很多好处-

效率(正如你已经指出的)。将对象传递到函数意味着创建对象的新副本。使用第三方库中的对象。如果您的对象属于第三方代码,作者打算仅通过指针(无复制构造函数等)使用其对象,这是唯一可以绕过此问题的方法对象正在使用指针。传递值可能会导致问题。(深拷贝/浅拷贝问题)。如果对象拥有资源,并且您希望该所有权不应与其他对象共享。

我将包括指针的一个重要用例。当您在基类中存储一些对象时,但它可能是多态的。

Class Base1 {
};

Class Derived1 : public Base1 {
};


Class Base2 {
  Base *bObj;
  virtual void createMemerObects() = 0;
};

Class Derived2 {
  virtual void createMemerObects() {
    bObj = new Derived1();
  }
};

因此,在这种情况下,不能将bObj声明为直接对象,必须有指针。

对于指针,

可以直接与存储器对话。可以通过操纵指针防止程序的大量内存泄漏。

这已经详细讨论过了,但在Java中,一切都是指针。它不区分堆栈和堆分配(所有对象都在堆上分配),因此您不会意识到您正在使用指针。在C++中,可以根据内存需求将两者混合使用。C++中的性能和内存使用更具确定性(duh)。