当前位置: 首页 > article >正文

从零到一学习c++(基础篇--筑基期十一-类)

 从零到一学习C++(基础篇) 作者:羡鱼肘子

温馨提示1:本篇是记录我的学习经历,会有不少片面的认知,万分期待您的指正。

 温馨提示2:本篇会尽量用更加通俗的语言介绍c++的基础,用通俗的语言去解释术语,但不会再大白话了哦。常见,常看,常想,渐渐的就会发现术语也是很简单滴。

 温馨提示3:看本篇前可以先了解前篇的内容,知识体系会更加完整哦。

从零到一学习c++(基础篇--筑基期十-函数)-CSDN博客

 

 温馨提示4:这部分内容只是入门c++类的一个预览,就基础阶段而言应该是够用的,学习的重心在于了解

类 (Class)

类(Class)是C++面向对象编程(OOP)的核心,相当于设计图纸,用来创建具有特定属性和行为的对象。

那么什么是面向对象编程(OOP呢?

在这我们抛开传统的术语,从日常生活的角度重新解读面向对象编程(OOP)


1. 角色扮演游戏:把代码变成「游戏角色」

想象我们在开发一款 RPG 游戏,每个角色都有自己的属性和技能:

  • 类(Class) = 角色模板
    比如「战士」「法师」的职业模板,定义了他们默认的血量、攻击方式。

  • 对象(Object) = 具体的游戏角色
    比如你创建了一个叫「亚瑟」的战士,他的等级、装备都是独特的。

  • 封装(Encapsulation) = 角色的隐私保护
    角色的背包里有什么装备,其他角色不能直接翻看,必须通过「交易」或「查看」方法交互。

  • 继承(Inheritance) = 职业继承通用能力
    「战士」和「法师」都继承了「玩家角色」的基础属性(比如移动、说话),但各自扩展了专属技能。

  • 多态(Polymorphism) = 同一技能的不同效果
    所有角色都有「攻击」技能,但战士用剑砍,法师放火球,效果完全不同。


2. 乐高积木:模块化拼装代码

把编程想象成拼乐高:

  • 类(Class) = 积木的模具
    比如一个「轮子模具」,可以生产无数个轮子(对象)。

  • 对象(Object) = 具体的积木块
    用轮子模具造出 4 个轮子,装到一辆车上。

  • 组合(Composition) = 用积木拼装复杂结构
    车 = 轮子 + 车身 + 引擎,每个部分独立开发,最后组合成整体。

  • 接口(Interface) = 积木的拼接规则
    所有能连接到车身的积木,必须有一个「卡扣接口」,不管它是轮子还是翅膀。


3. 自然界:生物学中的 OOP 思维

用生物进化理解 OOP:

  • 类(Class) = 物种分类
    比如「猫科动物」的定义:有爪子、会捕猎。

  • 对象(Object) = 个体生物
    你家的橘猫「大胖」,是「猫科动物」类的一个实例。

  • 继承(Inheritance) = 遗传与变异
    老虎继承了猫科动物的基础特征,但变异出了条纹皮毛。

  • 多态(Polymorphism) = 生存策略的多样性
    所有动物都要「觅食」,但老鹰抓鱼,羚羊吃草,行为完全不同。


那到底为什么要用 OOP呢?

  • 现实映射:代码结构和现实世界一致,人类更容易理解(比如游戏角色、公司员工)。

  • 分工合作:像流水线一样,不同程序员负责不同类,最后组装成大系统。

  • 减少重复:公共功能写在父类,子类直接复用(比如所有员工都要打卡)。

  • 灵活扩展:新增功能像「打补丁」,不影响原有代码(比如给游戏角色加一个新技能)。


一句话总结:

OOP 是把复杂问题拆解成一个个「活的对象」,让代码像现实世界一样,通过分工、协作、进化来解决问题。

 

一、类的基础:封装与抽象(抽象会放到下一个阶段介绍)

1. 类是什么?

 类的定义通常包括以下部分:

  • 数据成员:类的属性,用于存储对象的状态。

  • 成员函数:类的行为,用于操作数据成员或执行其他任务。

  • 访问控制:通过publicprivateprotected关键字控制成员的访问权限。

 详细解释--访问控制

  • public:公有成员可以在类的外部访问。

  • private:私有成员只能在类的内部访问。

  • protected:保护成员可以在类的内部和派生类中访问。

  • 类就像汽车的设计图纸,定义了汽车的组成部分(属性)和功能(方法)。

  • 代码示例

    class Car {
    public:// 属性(成员变量)string brand;int speed;// 方法(成员函数)void accelerate() { speed += 10; }void brake() { speed = 0; }
    };

2. 封装:隐藏细节,暴露接口

  • 驾驶员不需要知道发动机如何工作,只需踩油门(调用方法)。

  • 访问控制

    • public:对外公开(如油门、刹车)。

    • private:内部细节(如发动机、电路)。

    class BankAccount {
    private:double balance; // 私有属性,外部无法直接访问
    public:void deposit(double amount) { balance += amount; } // 公开方法
    };

3.类与结构体(struct

  • class默认成员为privatestruct默认成员为public

  • 现代C++中,struct常用于仅包含数据的简单类型(POD类型)。


二、构造函数与析构函数

1. 构造函数:对象的“出生证明”

  • 作用:初始化对象属性。

  • 默认构造函数:无参数或参数有默认值。

  • 委托构造函数(C++11):复用其他构造函数的代码。

    class Student {
    public:Student() : Student("匿名", 18) {} // 委托构造函数Student(string name, int age) : name(name), age(age) {}
    private:string name;int age;
    };

2. 析构函数:对象的“临终清理”

  • 作用:释放对象占用的资源(如内存、文件句柄)。

  • 现代C++技巧:用智能指针(unique_ptr/shared_ptr)替代手动资源管理。

    class FileHandler {
    public:FileHandler(const string& filename) {file = fopen(filename.c_str(), "r");}~FileHandler() { if (file) fclose(file); } // 析构时关闭文件
    private:FILE* file;
    };

三、类的进阶特性

1. 移动语义(C++11)

  • 问题:传统拷贝构造效率低(深拷贝大对象)。

  • 解决:“偷”临时对象(右值)的资源,避免拷贝。

    class DynamicArray {
    public:// 移动构造函数DynamicArray(DynamicArray&& other) noexcept : data_(other.data_), size_(other.size_) {other.data_ = nullptr; // 原对象置空other.size_ = 0;}
    private:int* data_;size_t size_;
    };

2. constexpr 成员函数(C++11)

  • 作用:编译期求值的函数,用于常量表达式。

    class Circle {
    public:constexpr Circle(double r) : radius(r) {}constexpr double area() const { return 3.14 * radius * radius; }
    private:double radius;
    };constexpr Circle c(5.0);
    constexpr double a = c.area(); // 编译期计算面积

3. 类成员的默认和删除(C++11)

  • 默认函数:显式要求编译器生成默认实现。

  • 删除函数:禁用某些函数(如拷贝构造)。

    class NonCopyable {
    public:NonCopyable() = default;NonCopyable(const NonCopyable&) = delete; // 禁止拷贝
    };

四、继承与多态

1. 继承:从基类“遗传”特性

  • 电动汽车(子类)继承汽车(基类)的基本属性,并增加电池特性。

    class ElectricCar : public Car {
    public:void charge() { battery = 100; }
    private:int battery;
    };

2. 多态:同一接口,不同实现

  • 虚函数:基类声明 virtual,子类用 override 重写(C++11)。

    class Shape {
    public:virtual double area() const = 0; // 纯虚函数(抽象类)
    };class Circle : public Shape {
    public:double area() const override { return 3.14 * r * r; } // 重写
    private:double r;
    };

五、现代C++最佳实践

1. 用 override 和 final 明确意图(C++11)

  • override:显式标记重写虚函数,避免拼写错误。

  • final:禁止子类进一步重写。

    class Base {
    public:virtual void func() {}
    };class Derived : public Base {
    public:void func() override final {} // 正确重写,且禁止子类重写
    };

2. 委托构造与继承构造(C++11)

  • 继承构造函数:复用基类构造函数。

    class Base {
    public:Base(int x) { /*...*/ }
    };class Derived : public Base {
    public:using Base::Base; // 继承基类构造函数
    };

3. 智能指针管理资源

  • unique_ptr:独占资源所有权。

  • shared_ptr:共享资源所有权。

    class Project {
    public:void addMember(const shared_ptr<Member>& m) {members.push_back(m);}
    private:vector<shared_ptr<Member>> members;
    };

     

六、综合示例:现代C++类的设计(体会一下这种风格就好,目前这是了解的内容)

#include <iostream>
#include <memory>
#include <vector>// 基类:图形
class Shape {
public:virtual double area() const = 0; // 纯虚函数virtual ~Shape() = default;      // 虚析构函数(C++11)
};// 派生类:圆形
class Circle : public Shape {
public:constexpr Circle(double r) noexcept : radius(r) {}double area() const override { return 3.14 * radius * radius; }
private:double radius;
};// 图形管理器(RAII管理资源)
class ShapeManager {
public:void addShape(std::unique_ptr<Shape> shape) {shapes.push_back(std::move(shape));}void printAreas() const {for (const auto& s : shapes) {std::cout << "面积: " << s->area() << std::endl;}}
private:std::vector<std::unique_ptr<Shape>> shapes;
};int main() {ShapeManager manager;manager.addShape(std::make_unique<Circle>(5.0)); // C++14的make_uniquemanager.printAreas();return 0;
}

七、总结:类的设计原则(建议熟悉哦,以后会经常用到的)

  1. 高内聚低耦合:每个类专注单一职责,减少依赖。

  2. 优先使用组合:通过组合其他类构建功能,而非过度继承。

  3. 资源管理:用RAII(如智能指针)替代手动new/delete

  4. 拥抱现代特性:移动语义、overrideconstexpr等提升代码质量。

小贴士:类就是自己的“代码乐高积木”,设计得越清晰、模块化,程序越容易维护和扩展!

 从零到一学习c++(基础篇--筑基期)结语

自此,我们c++的基础篇--筑基期部分就结束了,通过筑基期的学习我们对c++的一些基础知识有了概要性的了解,但是让我们独自去开发某一个项目的话,是不是感觉还是比较困难的呢? 不要灰心,因为我们还没有真正入门。欧克,趁热打铁,开始从零到一学习c++(基础篇--入门期)的学习吧!!!通过从零到一学习c++(基础篇--入门期)的学习,我们就可以比较轻松的实现一些小的项目和小部分大型工程啦。

 

 

相关文章:

从零到一学习c++(基础篇--筑基期十一-类)

从零到一学习C&#xff08;基础篇&#xff09; 作者&#xff1a;羡鱼肘子 温馨提示1&#xff1a;本篇是记录我的学习经历&#xff0c;会有不少片面的认知&#xff0c;万分期待您的指正。 温馨提示2&#xff1a;本篇会尽量用更加通俗的语言介绍c的基础&#xff0c;用通俗的语言去…...

Java基础常见的面试题(易错!!)

面试题一&#xff1a;为什么 Java 不支持多继承 Java 不支持多继承主要是为避免 “菱形继承问题”&#xff08;又称 “钻石问题”&#xff09;&#xff0c;即一个子类从多个父类继承到同名方法或属性时&#xff0c;编译器无法确定该调用哪个父类的成员。同时&#xff0c;多继承…...

DPVS-2:单臂负载均衡测试

上一篇编译安装了DPVS&#xff0c;这一篇开启DPVS的负载均衡测试 &#xff1a; 单臂 FULL NAT模式 拓扑-单臂 单臂模式 DPVS 单独物理机 CLINET&#xff0c;和两个RS都是另一个物理机的虚拟机&#xff0c;它们网卡都绑定在一个桥上br0 &#xff0c; 二层互通。 启动DPVS …...

C#中提供的多种集合类以及适用场景

在 C# 中&#xff0c;有多种集合类可供使用&#xff0c;它们分别适用于不同的场景,部分代码示例提供了LeetCode相关的代码应用。 1. 数组&#xff08;Array&#xff09; 特点 固定大小&#xff1a;在创建数组时需要指定其长度&#xff0c;之后无法动态改变。连续存储&#xf…...

【蓝桥杯集训·每日一题2025】 AcWing 6135. 奶牛体检 python

6135. 奶牛体检 Week 1 2月21日 农夫约翰的 N N N 头奶牛站成一行&#xff0c;奶牛 1 1 1 在队伍的最前面&#xff0c;奶牛 N N N 在队伍的最后面。 农夫约翰的奶牛也有许多不同的品种。 他用从 1 1 1 到 N N N 的整数来表示每一品种。 队伍从前到后第 i i i 头奶牛的…...

【为什么用pg数据库用 != null 过滤不出null值】

为什么用pg数据库用 ! null 过滤不出null值 1. NULL 的特殊性质2. 为什么 ! null 无效3. 正确的过滤 NULL 的方式示例 4. 为什么 IS NULL 和 IS NOT NULL 有效5. 示例对比6. 总结 在 PostgreSQL 中&#xff0c;使用 ! null 过滤不出 NULL 值的原因与 SQL 标准中 NULL 的特殊性质…...

Classic Control Theory | 12 Real Poles or Zeros (第12课笔记-中文版)

笔记链接&#xff1a;https://m.tb.cn/h.Tt876SW?tkQaITejKxnFLhttps://m.tb.cn/h.Tt876SW?tkQaITejKxnFL...

Kubernetes开发环境minikube | 开发部署MySQL单节点应用

minikube是一个主要用于开发与测试Kubernetes应用的运行环境 本文主要描述在minikube运行环境中部署MySQL单节点应用 minikube start --force kubectl get nodes 如上所示&#xff0c;启动minikube单节点运行环境 minikube ssh docker pull 如上所示&#xff0c;从MySQL官…...

大厂数据仓库数仓建模面试题及参考答案

目录 什么是数据仓库,和数据库有什么区别? 数据仓库的基本原理是什么? 数据仓库架构是怎样的? 数据仓库分层(层级划分),每层做什么?分层的好处是什么?数据分层是根据什么?数仓分层的原则与思路是什么? 数仓建模常用模型有哪些?区别、优缺点是什么?星型模型和雪…...

腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票

腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票 作者:某七年数据开发工程师 | 2025年02月23日 关键词:SQL窗口函数、连续问题、股票分析、腾讯面试题 一、问题背景与难点拆解 在股票量化分析场景中,"连续N天满足条件"是高频面试题类型。本题要求在单表stoc…...

安装可视化jar包部署平台JarManage

一、下载 下载地址&#xff1a;JarManage 发行版 - Gitee.com &#x1f692; 下载 最新发行版 下载zip的里面linux和windows版本都有 二、运行 上传到服务器&#xff0c;解压进入目录 &#x1f69a; 执行java -jar jarmanage-depoly.jar 命令运行 java -jar jarmanage-dep…...

基于数据可视化+SpringBoot+安卓端的数字化OA公司管理平台设计和实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…...

输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路

详细前端代码写于上一篇&#xff1a;输入搜索、分组展示选项、下拉选取&#xff0c;el-select 实现&#xff1a;即输入关键字检索&#xff0c;返回分组选项&#xff0c;选取跳转到相应内容页 —— VUE项目-全局模糊检索 【效果图】&#xff1a;分组展示选项 >【去界面操作体…...

性能巅峰对决:Rust vs C++ —— 速度、安全与权衡的艺术

??关注&#xff0c;带你探索Java的奥秘&#xff01;?? ??超萌技术攻略&#xff0c;轻松晋级编程高手&#xff01;?? ??技术宝库已备好&#xff0c;就等你来挖掘&#xff01;?? ??订阅&#xff0c;智趣学习不孤单&#xff01;?? ??即刻启航&#xff0c;编…...

unity学习53:UI的子容器:面板panel

目录 1 UI的最底层容器&#xff1a;canvas 1.1 UI的最底层容器&#xff1a;canvas 1.2 UI的合理结构 2 UI的子容器&#xff1a;面板panel 2.1 创建panel 2.2 面板的本质&#xff1a; image &#xff0c;就是一个透明的图片&#xff0c;1个空容器 3 面板的属性 4 面板的…...

4-知识图谱的抽取与构建-4_2实体识别与分类

&#x1f31f; 知识图谱的实体识别与分类&#x1f525; &#x1f50d; 什么是实体识别与分类&#xff1f; 实体识别&#xff08;Entity Recognition&#xff09;是从文本中提取出具体的事物&#xff0c;如人名、地名、组织名等。分类&#xff08;Entity Classification&#x…...

elasticsearch在windows上的配置

写在最前面&#xff1a; 上资源 第一步 解压&#xff1a; 第二步 配置两个环境变量 第三步 如果是其他资源需要将标蓝的文件中的内容加一句 xpack.security.enabled: false 不同版本的yaml文件可能配置不同&#xff0c;末尾加这个 xpack.security.enabled: true打开bin目…...

详解分布式ID实践

引言 分布式ID&#xff0c;所谓的分布式ID&#xff0c;就是针对整个系统而言&#xff0c;任何时刻获取一个ID&#xff0c;无论系统处于何种情况&#xff0c;该值不会与之前产生的值重复&#xff0c;之后获取分布式ID时&#xff0c;也不会再获取到与其相同的值&#xff0c;它是…...

如何在 Vue 项目中为 `el-pagination` 设置中文

文章目录 前言1. 安装 Element Plus2. 引入中文语言包3. 配置中文语言环境4. 使用 el-pagination 组件5. 确保其他组件支持中文6. 语言切换&#xff08;可选&#xff09;总结 前言 在 Vue 项目中&#xff0c;Element Plus 是一个流行的 UI 组件库&#xff0c;它提供了许多常用…...

PostgreSQL:更新字段慢

目录标题 PostgreSQL 慢查询优化与 pg_stat_statements 使用1. 启用慢查询日志2. 使用 pg_stat_statements 扩展收集查询统计信息3. 查找执行时间较长的查询4. 分析慢查询的执行计划5. 优化查询6. 检查并发连接和系统资源7. 进一步优化8. 查看某条SQL1. **如何生成 query_id**2…...

【Rust中级教程】2.8. API设计原则之灵活性(flexible) Pt.4:显式析构函数的问题及3种解决方案

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 说句题外话&#xff0c;这篇文章一共5721个字&#xff0c;是我截至目前写的最长的一篇文章&a…...

【复习】Redis

数据结构 Redis常见的数据结构 String&#xff1a;缓存对象Hash&#xff1a;缓存对象、购物车List&#xff1a;消息队列Set&#xff1a;点赞、共同关注ZSet&#xff1a;排序 Zset底层&#xff1f; Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…...

STM32使用NRF2401进行数据传送

NRF2401是一款由Nordic Semiconductor公司生产的单片射频收发芯片&#xff0c;以下是关于它的详细介绍&#xff1a; 一、主要特点 工作频段&#xff1a;NRF2401工作于2.4~2.5GHz的ISM&#xff08;工业、科学和医疗&#xff09;频段&#xff0c;该频段无需申请即可使用&#xf…...

Fetch API 与 XMLHttpRequest:深入剖析异步请求的利器

Hi&#xff0c;我是布兰妮甜 &#xff01;在现代 Web 开发中&#xff0c;异步通信是实现动态和交互式用户体验的基石。XMLHttpRequest (XHR) 作为老牌劲旅&#xff0c;曾一度统治着这一领域。然而&#xff0c;随着 Fetch API 的横空出世&#xff0c;开发者们迎来了一个更现代、…...

如何生成traceid以及可视化展示

根据你的需求&#xff0c;以下是一些可以生成唯一 traceId 并用于分布式链路追踪的工具和项目&#xff0c;这些项目支持生成唯一的 traceId&#xff0c;并将其用于日志记录和分布式追踪&#xff1a; 1. OpenTelemetry OpenTelemetry 是一个开源的观测框架&#xff0c;支持生成…...

【LeetCode541】反转字符串

题目描述 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前…...

DeepSeek、微信、硅基流动、纳米搜索、秘塔搜索……十种不同方法实现DeepSeek使用自由

为了让大家实现 DeepSeek 使用自由&#xff0c;今天分享 10 个畅用 DeepSeek 的平台。 一、官方满血版&#xff1a;DeepSeek官网与APP 首推&#xff0c;肯定是 DeepSeek 的官网和 APP&#xff0c;可以使用满血版 R1 和 V3 模型&#xff0c;以及联网功能。 网址&#xff1a; htt…...

C++:pthread线程分离和线程属性

在 C 的多线程编程中&#xff0c;pthread 库提供了强大的功能来管理线程。其中&#xff0c;线程分离和线程属性是两个重要的概念&#xff0c;它们对于优化线程的行为和资源管理有着关键作用。 线程分离 1.1 什么是线程分离 在 pthread 库中&#xff0c;线程有两种状态&#…...

Orange 开源项目 - 集成阿里云大模型

1 阿里云的大模型服务平台百炼 阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员&#xff0c;都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作&#xff0c;在5分钟内开发出一款大模型应用&#xff0c;或在几小时内训练…...

Docker 搭建 MySQL 数据库

Docker 搭建 MySQL 数据库 前言一、准备工作二、设置 MySQL 容器的目录结构三、配置 MySQL 容器四、自定义 MySQL 配置五、端口配置&#xff1a;Host 网络模式 vs Port 映射模式六、检查 MySQL 容器状态七、连接到 MySQL 容器八、备份与恢复总结 前言 在本篇文章中&#xff0c…...