[Basics of Classes]CPP Learn Data Day 0

发布时间:2026/5/26 7:41:01

[Basics of Classes]CPP Learn Data Day 0 原帖地址https://www.cnblogs.com/Reisentyan/p/19725010蒸馏舍友学过的西嘎嘎笔记。他写的笔记真好好得我看一眼就能记住这是个什么东西ai加持下。感觉很快就能学完吧一、 封装 (Encapsulation)核心思想隐藏内部实现细节对外提供安全的访问接口和初始化机制。访问控制private用于保护核心数据如m_ownerName,m_balance和内部辅助函数如isValidAmount外部无法直接访问。public暴露给外部的构造函数和操作接口。初始化列表构造函数使用冒号:语法进行成员变量的初始化支持条件判断如initialBalance 0 ? initialBalance : 0确保对象创建时的状态合法。命名规范参考代码习惯类成员函数常使用小驼峰命名如isValidAmount非类函数使用大驼峰。成员变量常加m_前缀以作区分。参考代码//一段关于封装的c代码classBankAccount{private:std::string m_ownerName{};doublem_balance{0};// 类函数用小驼峰非类函数用大驼峰boolisValidAmount(doubleamount)const{returnamount0;}public://构造函数BankAccount(std::string name,doubleinitialBalance):m_ownerName(name),m_balance(initialBalance0?initialBalance:0){};~BankAccount(){}};二、 组合 (Composition)核心思想将简单的类对象作为成员变量拼装成复杂的类“Has-a” 关系。实现方式在Car类中将Engine对象和Wheel数组作为私有成员变量m_myEngine,m_myWheels[4]。任务委托复杂对象通过调用内部成员对象的方法来实现功能。例如Car::drive()内部调用了Engine::start()和Wheel::roll()。参考代码//这是一段关于组合的代码classEngine{public:voidstart(){std::cout源神启动\n;}};classWheel{public:voidroll(){std::cout转动\n;}};classCar{private:Engine m_myEngine;Wheel m_myWheels[4];public:voiddrive(){std::cout准备出发...\n;m_myEngine.start();// 委托给内部的发动机对象去工作for(inti0;i4;i){m_myWheels[i].roll();}std::cout汽车行驶中\n;}};三、 多态 (Polymorphism)核心思想通过基类接口调用派生类的具体实现实现动态绑定。抽象基类 (Animal)纯虚函数声明后加 0如virtual void speak() const 0;强制要求派生类必须实现该函数。虚析构函数只要类中包含虚函数析构函数必须声明为virtual如virtual ~Animal() default;以防止通过基类指针删除派生类对象时发生内存泄漏。派生类 (Dog,Cat)使用override关键字修饰重写的虚函数由编译器检查函数签名是否与基类完全一致提高代码安全性。动态绑定与对象切片引用传递函数参数必须使用引用或指针*如const Animal animal。避免切片如果按值传递派生类对象会被裁剪为基类对象丢失原有特性对象切片。虚函数表 (V-Table)传入引用后程序在运行时通过查阅对象的虚函数表动态决定调用哪个具体类如Cat的函数。参考代码//以下为多态相关知识classAnimal{public://虚析构函数只要类里有虚函数析构函数必须写虚函数virtual~Animal()default;//加上0表示是纯虚函数virtualvoidspeak()const0;};classDog:publicAnimal{public://override保证在派生类中声明的重载函数与基类的虚函数有相同的签名voidspeak()constoverride{std::coutbark\n;}};classCat:publicAnimal{public:voidspeak()constoverride{std::coutmimi\n;}};//参数中的是很有必要的如果没有这个参数就会发生对象切片的特性//即将传入的Animal对象裁剪为基础的Animal对象voidmakeThemSpeak(constAnimalanimal){animal.speak();//这个时候编译器会去查阅传入对象的虚函数表//如果它是猫就会调用猫的函数return;}四、const关键字的用法图鉴const用于声明“只读契约”出现位置不同约束对象不同放在函数最前面修饰返回值声明返回的数据是只读的调用者不能修改该返回值。放在参数列表中修饰参数例如void makeThemSpeak(const Animal animal)。保证在函数内部绝对不会修改传入的参数对象。放在成员函数的圆括号后、大括号前修饰成员函数例如void speak() const override。专属特性仅限类的成员函数使用。底层原理成员函数被调用时编译器会隐式传递一个this指针。尾部const将这个this指针变为只读保证该函数不会修改类的任何成员变量。独立函数限制普通全局函数如makeThemSpeak没有this指针因此不能在尾部加const否则编译器会报错。

相关新闻