2

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

 1 year ago
source link: https://blog.devwiki.net/2023/04/24/cplusplus-new-object-new-ptr.html#cl-3
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

发表于2023-04-24 | 更新于 2023-04-24 | C++ 每日一问 - C++
字数总计: 1429 | 阅读时长: 1分钟 | 阅读量: 7

DevWiki Blog

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;
}

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK