从零到一学习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++(基础篇--入门期)的学习,我们就可以比较轻松的实现一些小的项目和小部分大型工程啦。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek技术全景解析:架构创新与行业差异化竞争力

一、DeepSeek技术体系的核心突破 架构设计&#xff1a;效率与性能的双重革新 Multi-head Latent Attention (MLA)&#xff1a;通过将注意力头维度与隐藏层解耦&#xff0c;实现显存占用降低30%的同时支持4096超长上下文窗口。深度优化的MoE架构&#xff1a;结合256个路由专家…

插入排序:一种简单而直观的排序算法

大家好&#xff01;今天我们来聊聊一个简单却非常经典的排序算法——插入排序&#xff08;Insertion Sort&#xff09;。在所有的排序算法中&#xff0c;插入排序是最直观的一个。 一、插入排序的基本思想 插入排序的核心思想是&#xff1a;将一个待排序的元素&#xff0c;插…

2025年校园网络招聘会汇总

1、卫生健康行业2025届毕业生春季校园网络招聘会 企业数量职位数量岗位数量10020002000 访问地址&#xff1a; https://www.weirenjob.com/zph/zph_wsjkxy2025jbyscjxywlzph/ 2、山东地区面向2025届高校毕业生网络招聘活动 企业数量职位数量岗位数量909271052434 访问地址&a…

Windows 10 GPU STACK 0.5.1 安装

Windows 10 GPU STACK 0.5.1 安装 1 GPUStack 安装1.Python安装&#xff08;3.10/11/12&#xff09;2.GPUStack 下载3.生成密码4.访问5.设置模型下载目录6.禁用开机自启并重启服务7.安装模型8.查看安装的进度 2.试验场聊天测试1.对话模式 3.API Key 测试 1 GPUStack 安装 1.Py…

【数据结构】快指针和慢指针

一、 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 要求&#xff1a;只遍历一遍链表 可以使用快慢指针&#xff1a;fast 一次走两步&#xff0c;slow 一次走一步。当 fast NULL&#xff08;偶数个结点&#xff09;或…

1.3 嵌入式系统的固件

嵌入式系统的固件&#xff0c;一般情况下的作用是: 1.硬件抽象层&#xff08;HAL&#xff09;&#xff1a;固件提供了一个硬件抽象层&#xff0c;它将硬件的复杂性隐藏起来&#xff0c;为上层软件提供了一套标准的接口。这样&#xff0c;操作系统和应用程序不需要直接与硬件打交…

中国工业互联网研究院:人工智能大模型年度发展趋势报告

当前&#xff0c;以大模型为代表的人工智能正快速演进&#xff0c;激发全球科技之变、产业之变、时代之变&#xff0c;人工智能发展迎来新高潮。随着大模型推理、多模态生成、智能体等创新技术的发展&#xff0c;大模型赋能千行百业将进一步提速。中国工业互联网研究院全方位剖…

【cv】vs2022配置opencv

release下配置包含目录和库目录 E:\sdk\sdk_cuda12.3\opencv490\include E:\sdk\sdk_cuda12.3\opencv490\include\opencv2 E:\sdk\sdk_cuda12.3\opencv490\lib release下配置包含链接器输入的依附依赖项 opencv_world490.lib release编译文件夹下需手动复制opencv_world49…

Python Pandas库使用指南:从入门到精通

1. 引言 Pandas 是 Python 中用于数据处理和分析的核心库之一。它提供了高效的数据结构(如 DataFrame 和 Series),能够轻松处理结构化数据,支持数据清洗、过滤、聚合、合并等操作。Pandas 在数据分析、机器学习和科学计算领域中被广泛使用。 本文将详细介绍 Pandas 的基本…

Visual Studio中打开多个项目

1) 找到解决方案窗口 2) 右键添加→ 选择现有项目 3) 选择.vcxproj文件打开即可

react路由总结

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

内外网隔离文件传输解决方案|系统与钉钉集成+等保合规,安全提升70%

一、背景与痛点 在内外网隔离的企业网络环境中&#xff0c;员工与外部协作伙伴&#xff08;如钉钉用户&#xff09;的文件传输面临以下挑战&#xff1a; 1. **安全性风险**&#xff1a;内外网直连可能导致病毒传播、数据泄露。 2. **操作繁琐**&#xff1a;传统方式需频繁切…

多线程篇学习面试

多线程 1.乐观锁、CAS思想 java乐观锁机制&#xff1a; ​ 乐观锁体现的是悲观锁的反面。它是一种积极的思想&#xff0c;它总是认为数据是不会被修改的&#xff0c;所以是不会对数据上锁的。但是乐观锁在更新的时候会去判断数据是否被更新过。乐观锁的实现方案一般有两种&a…

云服务器和物理服务器该如何选择

随着互联网的快速发展&#xff0c;企业大多都会选择云服务器和物理服务器进行使用&#xff0c;那么对于云服务器和物理服务器两者之间该如何进行选择呢&#xff1f; 云服务器可以为用户和企业提供网站处理中等到高流量所需要的一切&#xff0c;云服务器中的高可用能性功能&…

将产品照片(form.productPhotos)转为 JSON 字符串发送给后端

文章目录 1. 前端 form.productPhotos 的当前处理a. 组件绑定b. 当前发送逻辑 2. 如何将 form.productPhotos 转为 JSON 字符串发送给后端a. 修改前端 save() 方法b. 确保 esave API 支持接收字符串 基于你提供的 identify-form.vue 代码&#xff0c;我将分析如何将产品照片&a…

SpringCloud系列教程:微服务的未来(二十五)-基于注解的声明队列交换机、消息转换器、业务改造

前言 在现代分布式系统中&#xff0c;消息队列是实现服务解耦和异步处理的关键组件。Spring框架提供了强大的支持&#xff0c;使得与消息队列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成变得更加便捷和灵活。本文将深入探讨如何利用Spring的注解驱动方式来配置和管理队…

国产编辑器EverEdit - 文本编辑器的关键特性:文件变更实时监视,多头编辑不掉坑

1 监视文件变更 1.1 应用场景 某些时候&#xff0c;用户会使用多个编辑器打开同一个文件&#xff0c;如果在A编辑器修改保存&#xff0c;但是B编辑器没有重新打开&#xff0c;直接在B编辑器修改再保存&#xff0c;则可能造成在A编辑器中修改的内容丢失&#xff0c;因此&#x…

HAProxy介绍与编译安装

目录 1、HAProxy介绍 2、HAProxy编译安装 Centos 基础环境 Ubuntu 基础环境 编译安装HAProxy 验证HAProxy版本 HAProxy启动脚本 配置文件 启动haproxy 验证haproxy状态 查看haproxy的状态页面 1、HAProxy介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年…

python类型转换深浅拷贝

1.类型转换 1.1 int(x):转化为一个整数&#xff0c;只能转换由纯数字组成的字符串 float->int 浮点型强转整形会去掉小数点后面的数&#xff0c;只保留整数部分 a 1.2 print(type(a)) #<class float> b int(a) print(type(b)) #<class int>print(int…

分布式光纤声波振动技术在钻井泄漏检测中的应用

在石油天然气的钻井作业中&#xff0c;及时发现并定位泄漏点对于保障开采安全、降低环境污染以及避免经济损失至关重要。传统的泄漏检测方法往往存在局限性&#xff0c;而分布式光纤声波振动技术凭借其独特的优势&#xff0c;正逐渐成为钻井过程中寻找泄漏的有力工具。 技术原理…