You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在C++中创建对象时要使用对象指针?附代码示例

为什么创建对象时要使用对象指针(比如employee *Steve = new employee();)

下面从实际开发场景的角度解释原因:

  • 动态内存分配的灵活性
    用new创建的对象存放在堆内存中,而直接声明的对象(如employee Steve;)在栈内存中。栈的空间有限(通常仅几MB),如果对象体积较大,或者需要在当前函数作用域之外持续存在,堆分配会是更合适的选择。比如在函数中创建大对象并需要返回给外部时,栈对象会随函数结束销毁,堆指针就能解决这个问题。

  • 支持多态核心特性
    如果employee是基类,后续有Manager、Engineer这类派生类,用基类指针可以指向任意派生类对象,实现运行时多态。比如employee *staff = new Manager();,这样就能用统一的指针类型处理不同子类对象,而直接声明值类型对象会发生对象切片,只能保留基类部分的内容,无法体现多态特性。

  • 延迟对象初始化
    你可以根据程序运行时的条件决定何时创建对象,而非在声明阶段就必须初始化。比如只有用户触发特定操作时,才调用new创建对应对象,避免提前占用不必要的内存资源。

  • 减少拷贝性能开销
    当需要传递对象给函数,或从函数返回对象时,传递指针仅需传递一个内存地址(通常8字节),而传递值类型会触发完整的对象拷贝。如果对象包含大数组、复杂结构,拷贝的性能开销会非常明显,用指针就能避免这类问题。

另外需要注意:用new创建的对象需要手动调用delete释放内存(比如你的代码里应该加上delete Steve;),否则会造成内存泄漏。如果不想手动管理内存,C++11之后可以用智能指针(如std::unique_ptr<employee> Steve = std::make_unique<employee>();)来自动释放内存。

你的代码如果改成不用指针的写法,示例如下:

#include <iostream>
#include <string.h>
using namespace std;

class employee{
private:
    char name[40];
    int salary;
public:
    employee(){
        strcpy(name, "unnamed");
        salary = 0;
    }
    char *getName(){
        return name;
    }
};

int main(){
    employee Steve; // 直接声明栈对象
    cout<<"Name: "<< Steve.getName();
}

这种写法中,Steve会在main函数结束时自动销毁,无需手动释放内存,但也失去了上述指针带来的优势。

内容的提问来源于stack exchange,提问作者Enkhbayar Ganbold

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:25:31