网站收费标准仪器网站模板
2026/6/20 8:12:53 网站建设 项目流程
网站收费标准,仪器网站模板,建设银行网站登陆不了,餐饮加盟网站建设方案C 中面向对象编程#xff08;OOP#xff09;核心概念——类的定义、封装、继承及类层次结构——的清晰概述。以下是对该内容的系统性梳理与补充说明#xff0c;便于深入理解#xff1a; 1. 类的定义与核心组成 类的本质#xff1a;是一种用户自定义的数据类型#xff0c…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 原则资源获取即初始化对象生命周期严格绑定资源生命周期。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询