为何在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

