侧边栏壁纸
博主头像
DevWiki博主等级

不怕慢,只怕站!

  • 累计撰写 156 篇文章
  • 累计创建 90 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
C++

C++中A a; 与 A* a = new A(); 有什么不同?

DevWiki
2023-04-24 / 0 评论 / 0 点赞 / 1 阅读 / 2918 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-03-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

C++中A a; 与 A* a = new A(); 有什么不同?

区别

A a;A* a = new A(); 是两种不同的对象定义方式,其区别如下:

  1. 内存分配方式不同:A a; 是在栈上分配内存,而 A* a = new A(); 是在堆上分配内存。
  2. 返回值类型不同:A a; 返回的是一个对象,而 A* a = new A(); 返回的是一个指向对象的指针。
  3. 构造函数调用方式不同:A a; 调用的是默认构造函数,而 A* a = new A(); 调用的是默认构造函数和 operator new 函数。
  4. 内存管理方式不同:A a; 在作用域结束时自动调用析构函数,释放分配在栈上的内存,而 A* a = new A(); 必须手动调用 delete 函数来释放分配在堆上的内存。
  5. 调用对象函数的方式不同, 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;
}

后记

如果你喜欢我的内容, 请关注我的微信公众号:

或者加入微信群, 一起交流学习。

image-20230423125404712

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区