C++ 中面向对象编程(OOP)核心概念——**类的定义、封装、继承及类层次结构**——的清晰概述
C 中面向对象编程OOP核心概念——类的定义、封装、继承及类层次结构——的清晰概述。以下是对该内容的系统性梳理与补充说明便于深入理解1. 类的定义与核心组成类的本质是一种用户自定义的数据类型是对具有相同属性和行为的一组对象的抽象建模。成员分类数据成员属性描述对象的状态如Name,Age可为基本类型、指针、其他类对象等。成员函数方法描述对象的行为如Change(),Retire()可访问/修改本类数据成员。访问控制符private仅限类内部成员函数访问默认访问级别public对类外代码完全开放protected类内 派生类可访问但外部不可见用于继承场景。特殊成员函数构造函数无返回类型名称与类名相同支持重载用于对象创建时初始化如分配内存、赋初值析构函数无参数、无返回值、名称为~ClassName()自动调用用于清理资源如delete[] Name⚠️ 注意若含指针成员如char *Name需手动实现深拷贝构造函数、赋值运算符重载、析构函数即“三法则”或 C11 后的“五法则”以避免浅拷贝引发的内存错误。2. 继承与类层次结构继承方式影响基类成员在派生类中的访问权限public继承基类public成员在派生类中仍为publicprotected保持protectedprivate不可访问。protected/private继承较少使用会进一步限制访问权限。子类特性自动获得基类的非私有成员数据函数无需重复定义可添加新成员如Manager::Level可重定义override基类虚函数以实现多态需配合virtual关键字可通过作用域解析符Employee::Retire()显式调用被隐藏/重写的基类函数。构造/析构顺序关键构造先基类 → 后派生类确保基类已就绪析构先派生类 → 后基类确保派生部分清理完毕后才释放基类资源若基类构造函数需参数派生类构造函数必须通过成员初始化列表显式调用如Manager(char* n, int a, int l) : Employee(n,a), Level(l) {}。3. 面向对象三大特性再强调特性实现机制示例说明封装访问控制符 成员函数接口private数据仅通过public函数操作继承class Derived : access BaseManager复用并扩展Employee功能多态virtual函数 指针/引用动态绑定Employee* p new Manager; p-Retire();调用Manager::Retire()若重写且声明为virtual✅最佳实践提醒对于动态分配的资源如char* Name务必在析构函数中delete[] Name并在构造函数中new char[strlen(name)1]使用std::string替代char*可自动管理内存避免常见错误在设计基类时若预期被继承应将析构函数声明为virtual ~Employee() default;防止派生类对象通过基类指针删除时未调用派生类析构函数内存泄漏风险。在含有指针成员如char* Name的类中必须显式定义拷贝构造函数和赋值运算符重载否则编译器会自动生成默认的浅拷贝shallow copy版本这极易引发严重运行时错误。原因和后果如下✅ 为什么需要显式定义编译器生成的默认拷贝构造函数和赋值运算符执行的是按字节复制bitwise copy对于普通数据成员如int Age复制值是安全的但对于指针成员如char* Name它只复制指针地址而非指针所指向的动态内存内容→ 多个对象的指针指向同一块堆内存。这就导致双重释放double free当两个对象析构时各自调用delete[] Name对同一内存释放两次 → 未定义行为程序崩溃、内存损坏悬空指针dangling pointer一个对象析构后释放了内存另一对象的指针仍指向已释放区域后续访问将导致段错误或数据错乱意外的数据覆盖若一个对象通过Name修改字符串另一个对象会“意外”看到相同修改因共享内存破坏封装与独立性。 这就是著名的“三法则Rule of Three”C11 后扩展为“五法则”若类需要自定义以下任一函数通常也需要显式定义其余几个析构函数因管理资源拷贝构造函数需深拷贝拷贝赋值运算符需深拷贝 自我赋值检查 旧资源清理 C11移动构造函数、移动赋值运算符 示例说明以Employee为例classEmployee{char*Name;intAge;public:Employee(constchar*name,intage){Namenewchar[strlen(name)1];strcpy(Name,name);Ageage;}// ❌ 缺失拷贝构造函数和 operator → 编译器生成浅拷贝~Employee(){delete[]Name;}};// 危险使用Employeee1(Alice,30);Employee e2e1;// 调用默认拷贝构造函数 → e1.Name 和 e2.Name 指向同一内存// e1 和 e2 析构时均执行 delete[] Name → double free✅ 正确做法深拷贝实现// 拷贝构造函数Employee(constEmployeeother):Age(other.Age){Namenewchar[strlen(other.Name)1];strcpy(Name,other.Name);}// 拷贝赋值运算符含自我赋值检查 旧资源释放Employeeoperator(constEmployeeother){if(thisother)return*this;// 自我赋值防护delete[]Name;// 释放当前资源Namenewchar[strlen(other.Name)1];strcpy(Name,other.Name);Ageother.Age;return*this;} 更现代、更安全的替代方案推荐使用std::string替代char*→ 自动管理内存拷贝/赋值由标准库保证安全使用智能指针如std::unique_ptrchar[]→ 移动语义明确禁止拷贝避免误用遵循 RAII 原则资源获取即初始化对象生命周期严格绑定资源生命周期。

相关新闻

#序列容器

#序列容器

QVector的原理QVector 是 Qt 框架提供的动态数组容器,功能类似于 C 标准库的 std::vector,但和 Qt 生态的其他类(如 QString、QVariant)兼容性更好,还提供了一些 Qt 专属的便捷接口。底层存储结构:QVector使…

2026/7/3 14:54:03 阅读更多 →
DirectX详细图文安装教程(包含安装包),DirectX安装步骤,DirectX修复工具增强版

DirectX详细图文安装教程(包含安装包),DirectX安装步骤,DirectX修复工具增强版

当您的电脑在运行游戏或图形软件时出现错误,很可能是 DirectX组件出了状况。DirectX Repair修复工具优化增强版 V4.4能帮您轻松搞定这些问题。 DirectX修复工具是一款专门用于修复DirectX相关问题的系统级工具,能够自动检测并修复缺失或损坏的DirectX组…

2026/7/3 14:54:07 阅读更多 →
Qt常用控件指南(7)

Qt常用控件指南(7)

Qt常用控件深度解析与实战应用:从时间处理到交互逻辑 在图形用户界面(GUI)开发中,控件(Widgets)不仅是构建界面的基石,更是用户与应用程序进行交互的桥梁。Qt框架提供了极其丰富且功能强大的控…

2026/7/5 2:19:15 阅读更多 →

最新新闻

曲线曲线2D解析求交方案

曲线曲线2D解析求交方案

曲线曲线2D解析求交方案 文章目录曲线曲线2D解析求交方案一. 2D 点到椭圆的最近点计算1. 推荐主方案:λ 方程 Halley bracket 保护2. bracket 区间3. Halley bracket 保护4. Newton bracket 对比实现5. 轴线和中心特殊情况6. 椭圆弧最近点7. 方向角初值方案的定位…

2026/7/5 3:23:00 阅读更多 →
Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?

Entity Framework 4.1 DbContext使用记之三——如何玩转实体的属性值?

今天为大家带来DbSet.Local属性的使用与实现。和上次介绍的Find函数首先查找context中缓存的实体类似,DbSet的Local属性也是返回context中缓存并且被跟踪的实体。不同点在于,Local属性不会返回状态为EntityState.Deleted的实体,且即使缓存中什…

2026/7/5 3:23:00 阅读更多 →
面试官问:项目中分布式事务怎么处理的?

面试官问:项目中分布式事务怎么处理的?

第一层:先讲本地事务 Transactional(基础铺垫)先从单体本地事务切入,体现基础功底:单体服务单库场景,我们用 Spring 的 Transactional 声明式本地事务;底层依靠 AOP 实现,保证同一个…

2026/7/5 3:23:00 阅读更多 →
KARL四维权限模型:资源粒度、操作语义、上下文约束与继承链路深度解析

KARL四维权限模型:资源粒度、操作语义、上下文约束与继承链路深度解析

1. 项目概述:KARL权限模型不是“配个role”就完事的系统工程KARL——这个在开源知识协作领域低调但极具设计深度的平台,它的权限体系远非传统RBAC(基于角色的访问控制)所能简单概括。我第一次接触KARL是在2021年参与一个高校数字人…

2026/7/5 3:18:59 阅读更多 →
微信 Dat 文件逆向分析:从 0x17CE 文件头到 PNG 图片的 3 步解密实战

微信 Dat 文件逆向分析:从 0x17CE 文件头到 PNG 图片的 3 步解密实战

微信 Dat 文件逆向实战:从文件头特征到自定义解密工具开发在移动互联网时代,即时通讯软件产生的数据安全一直是个值得关注的话题。作为国内主流的社交应用,微信对本地存储的图片、视频等多媒体文件采用了特定的加密保护措施。本文将带您深入探…

2026/7/5 3:18:59 阅读更多 →
Android随笔-APP首次启动流程

Android随笔-APP首次启动流程

从用户点击应用图标到 Activity 执行 onCreate() 的完整流程,涉及 Launcher 进程 → SystemServer 进程 → Zygote 进程 → 应用进程 之间的多轮跨进程通信。以下是详细拆解: 一、核心通信方式概览通信双方IPC 方式作用Launcher → AMS/ATMSBinder IPC发…

2026/7/5 3:18:58 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻