C++中A a; 与 A* a = 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 运算符来分配对象内存则更为适合。
测试
定义Class A:
// A.h
class A {
private:
int a;
public:
A();
~A();
void Test();
};
// A.cpp
#include <iostream>
#include "A.h"
A::A() {
}
A::~A() {
}
void A::Test(){
std::cout << "A Test!";
}
测试调用:
// 预处理器编译指令: #include
#include "iostream"
#include "A.h"
//编译指令: using namespace
using namespace std;
//函数头: int main() 及 函数体 {}
int main() {
A a;
A* aPtr = new A();
a.Test();
aPtr->Test();
delete aPtr;
return 0;
}
后记
如果你喜欢我的内容, 请关注我的微信公众号:
或者加入微信群, 一起交流学习。
评论区