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

Object *myObject = new Object;

而不是:

Object myObject;

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

myObject.testFunc();

我们必须写下:

myObject->testFunc();

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


当前回答

但我不明白为什么我们要这样使用它?

如果您使用:

Object myObject;

在函数内部,此函数返回后,myObject将被销毁。因此,如果您不需要函数外的对象,这很有用。此对象将放在当前线程堆栈上。

如果在函数体内部写入:

 Object *myObject = new Object;

那么,一旦函数结束,myObject指向的Object类实例将不会被销毁,并且分配在堆上。

现在,如果您是Java程序员,那么第二个示例更接近于对象分配在Java下的工作方式。此行:Object*myObject=new Object;等效于java:Object myObject=new Object();。不同的是,在javamyObject下,它将被垃圾收集,而在c++下,它不会被释放,您必须在某处显式调用“delete myObject;”否则会导致内存泄漏。

自从c++11以来,您可以通过在shared_ptr/unique_ptr中存储值来使用安全的动态分配方式:新对象。

std::shared_ptr<std::string> safe_str = make_shared<std::string>("make_shared");

// since c++14
std::unique_ptr<std::string> safe_str = make_unique<std::string>("make_shared"); 

此外,对象通常存储在容器中,如map-s或vector-s,它们将自动管理对象的生命周期。

其他回答

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

但要小心动态对象

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

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

Object *myObject = new Object;

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

Object myObject;

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

但我不明白为什么我们要这样使用它?

如果您使用:

Object myObject;

在函数内部,此函数返回后,myObject将被销毁。因此,如果您不需要函数外的对象,这很有用。此对象将放在当前线程堆栈上。

如果在函数体内部写入:

 Object *myObject = new Object;

那么,一旦函数结束,myObject指向的Object类实例将不会被销毁,并且分配在堆上。

现在,如果您是Java程序员,那么第二个示例更接近于对象分配在Java下的工作方式。此行:Object*myObject=new Object;等效于java:Object myObject=new Object();。不同的是,在javamyObject下,它将被垃圾收集,而在c++下,它不会被释放,您必须在某处显式调用“delete myObject;”否则会导致内存泄漏。

自从c++11以来,您可以通过在shared_ptr/unique_ptr中存储值来使用安全的动态分配方式:新对象。

std::shared_ptr<std::string> safe_str = make_shared<std::string>("make_shared");

// since c++14
std::unique_ptr<std::string> safe_str = make_unique<std::string>("make_shared"); 

此外,对象通常存储在容器中,如map-s或vector-s,它们将自动管理对象的生命周期。

对于指针,

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