「C/C++」C++经验篇 之 类内数据指针存放和单纯存放区别

在这里插入图片描述

✨博客主页
何曾参静谧的博客(✅关注、👍点赞、⭐收藏、🎠转发)
📚全部专栏(专栏会有变化,以最新发布为准)
「Win」Windows程序设计「IDE」集成开发环境「定制」定制开发集合
「C/C++」C/C++程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「UG/NX」BlockUI集合
「Py」Python程序设计「Math」探秘数学世界「PK」Parasolid函数说明
「Web」前后端全栈开发「En」英语从零到一👍占位符
「AI」人工智能大模型「书」书籍阅读笔记

类内数据指针存放和单纯存放区别

在 C++ 中,类(Class)内部存放 指针数据单纯的数据(值类型) 有显著的区别,主要体现在 内存管理、生命周期、拷贝行为、性能开销 等方面。以下是详细对比:


1. 内存管理方式

类别存放指针 (T*)存放值类型 (T)
存储内容存储的是内存地址(指向堆/外部数据)直接存储对象本身(通常在栈或类内存布局中)
内存所有权需手动管理(new/delete)或使用智能指针自动管理(随对象创建/销毁)
示例int* ptr = new int(42);int value = 42;

关键区别

  • 指针需要显式管理内存,否则可能导致 内存泄漏悬垂指针
  • 值类型由编译器自动管理,无需额外操作。

2. 生命周期

类别指针数据值类型数据
生命周期依赖外部管理(可能比类对象更长或更短)与类对象生命周期一致(析构时自动销毁)
风险可能访问已释放的内存(悬垂指针)无此风险

示例

class Example {
public:
    int* ptr;  // 指针:生命周期需手动管理
    int value; // 值类型:自动管理
};

void demo() {
    Example obj;
    obj.ptr = new int(100); // 需手动释放
    obj.value = 200;        // 自动销毁
    delete obj.ptr;         // 忘记释放则内存泄漏!
}

3. 拷贝行为

类别指针数据值类型数据
默认拷贝浅拷贝(仅复制指针地址,共享同一数据)深拷贝(复制整个对象)
风险多个对象共享同一数据,可能导致意外修改无共享问题,但可能有性能开销

示例

class ShallowCopy {
public:
    int* ptr;
    ShallowCopy(int v) : ptr(new int(v)) {}
    ~ShallowCopy() { delete ptr; }
};

void problem() {
    ShallowCopy a(10);
    ShallowCopy b = a; // 浅拷贝:a.ptr 和 b.ptr 指向同一内存
    // a 析构时释放 ptr,b 的 ptr 变为悬垂指针!
}

解决方案

  • 指针数据需实现 深拷贝构造函数拷贝赋值运算符
  • 或使用 std::shared_ptr 等智能指针自动管理共享所有权。

4. 性能与开销

类别指针数据值类型数据
内存占用固定(指针大小,通常 4/8 字节)取决于对象大小
访问速度需解引用(可能缓存不友好)直接访问(通常更快)
适用场景大对象、多态、共享数据小对象、频繁访问的场景

示例

// 指针:适合大对象或动态多态
class Base { virtual void foo(); };
class Derived : public Base { void foo() override; };

Base* obj = new Derived(); // 多态必须用指针/引用

// 值类型:适合小型数据
struct Point { int x, y; };
Point p1 = {1, 2}; // 值类型更高效

5. 多态与灵活性

类别指针数据值类型数据
多态支持支持(基类指针指向派生类)不支持(对象切片问题)
动态扩展可动态分配大小(如 std::vector<T*>大小固定

多态示例

class Animal { public: virtual void speak() = 0; };
class Dog : public Animal { void speak() override { cout << "Woof!"; } };

Animal* animal = new Dog(); // 正确
Dog dog; 
Animal animal = dog;        // 错误:对象切片(丢失派生类信息)

总结:何时选择指针 vs 值类型?

选择指针选择值类型
需要多态(基类指针指向派生类)对象很小(如 intPoint
对象很大(避免拷贝开销)需要自动生命周期管理
需共享数据(多个对象引用同一数据)频繁访问(减少解引用开销)
动态大小(如链表、树节点)简单数据结构(无共享需求)

最佳实践

  • 优先使用 值类型(更安全、更高效)。
  • 仅在必要时使用指针,并推荐 智能指针(如 std::unique_ptrstd::shared_ptr)避免内存问题。

何曾参静谧的博客(✅关注、👍点赞、⭐收藏、🎠转发)


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何曾参静谧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值