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 运算符来分配对象内存则更为适合。