C++ 中的两种创建对象方式:
A a;
A& ap = new A();
这两种有什么区别?
A a; 与 A* a = new A(); 是两种不同的对象定义方式,其区别如下:
内存分配方式不同:A a; 是在栈上分配内存,而 A* a = new A(); 是在堆上分配内存。
返回值类型不同:A a; 返回的是一个对象,而 A* a = new A(); 返回的是一个指向对象的指针。
构造函数调用方式不同:A a; 调用的是默认构造函数,而 A* a = new A(); 调用的是默认构造函数和 operator new 函数。
内存管理方式不同:A a; 在作用域结束时自动调用析构函数,释放分配在栈上的内存,而 A* a = new A(); 必须手动调用 delete 函数来释放分配在堆上的内存。
调用对象函数的方式不同, A a; 调用函数方式为 a.MethodName(), 而 A* a = new A(); 调用函数的方式为 a --> MethodName()
总的来说,使用 A a; 定义对象比使用 A* a = new A(); 更为常见,因为栈内存的分配和释放速度比堆内存要快,且不需要手动调用 delete 函数。
但在某些情况下,例如需要在函数外部访问该对象,或者需要动态分配对象的大小时,使用 new 运算符来分配对象内存则更为适合。