【C++】类的概念与基本使用介绍
C++类是面向对象编程(OOP)的基础,它允许我们将数据(属性)和行为(方法)封装在一起,形成一个自定义的数据类型。以下是C++类的基本概念、特点、特性以及使用注意事项,最后会提供一个简单的代码示例。
1. 类的基本概念
- 类(Class):类是一个用户定义的数据类型,它包含数据成员(属性)和成员函数(方法)。
- 对象(Object):对象是类的实例,可以创建多个对象。
- 封装(Encapsulation):将数据和对数据的操作封装在一起,只对外暴露必要的接口。
- 继承(Inheritance):允许一个类继承另一个类的属性和方法。
- 多态(Polymorphism):允许不同类的对象对同一消息做出响应。
2. 类的特点
- 抽象:类提供了一种抽象手段,可以隐藏内部实现细节。
- 封装:类将数据和操作数据的方法封装在一起,提高了代码的可维护性和安全性。
- 继承:类可以继承其他类的特性,实现代码复用。
- 多态:类可以通过虚函数实现多态,使得同一操作可以作用于不同类型的对象。
3. 类的特性
- 数据成员:类中定义的数据变量。
- 成员函数:类中定义的函数。
- 构造函数:用于初始化对象。
- 析构函数:用于清理对象。
- 访问修饰符:public、private、protected,用于控制成员的访问权限。
在C++中,public
、private
和 protected
是三种访问修饰符,它们用于控制类成员(包括数据成员和成员函数)的访问权限。以下是这三种访问修饰符的区别:
3.1 public
- public成员可以被类的外部访问,无论这些外部访问是通过对象还是通过类的继承关系。
- public成员是类的公共接口的一部分,通常用于提供对类外部的方法和数据的访问。
3.2 private
- private成员只能被类内部的成员函数(包括构造函数、析构函数和友元函数)访问。
- private成员用于实现类的内部工作细节,隐藏实现细节,防止类外部直接访问和修改,保证了类的封装性。
- private成员不能被派生类(子类)访问,即使是派生类中定义的成员函数也不能直接访问基类的private成员。
3.3 protected
- protected成员与private成员类似,但它们可以被派生类访问。
- protected成员通常用于那些需要在派生类中直接访问,但在类外部不应该被访问的数据和行为。
- 与private成员一样,protected成员不能被类的外部访问,但它们可以被派生类的成员函数访问,无论是直接访问还是通过继承链。
下面是一个简单的例子来说明这三种访问修饰符的区别:
class Base {
public:int publicVar; // 公共变量,可以被外部访问void publicFunc() { // 公共函数,可以被外部调用// 可以访问public, private, protected成员}private:int privateVar; // 私有变量,只能在类内部访问void privateFunc() { // 私有函数,只能在类内部调用// 可以访问public, private, protected成员}protected:int protectedVar; // 保护变量,可以在类内部和派生类中访问void protectedFunc() { // 保护函数,可以在类内部和派生类中调用// 可以访问public, private, protected成员}
};class Derived : public Base {
public:void accessBaseMembers() {publicVar = 10; // 可以访问基类的public成员// privateVar = 20; // 错误:不能访问基类的private成员protectedVar = 30; // 可以访问基类的protected成员publicFunc(); // 可以调用基类的public成员函数// privateFunc(); // 错误:不能调用基类的private成员函数protectedFunc(); // 可以调用基类的protected成员函数}
};int main() {Base base;base.publicVar = 10; // 正确:可以访问public成员// base.privateVar = 20; // 错误:不能访问private成员// base.protectedVar = 30; // 错误:不能访问protected成员base.publicFunc(); // 正确:可以调用public成员函数// base.privateFunc(); // 错误:不能调用private成员函数// base.protectedFunc(); // 错误:不能调用protected成员函数return 0;
}
在这个例子中,Base
类定义了public、private和protected成员。Derived
类继承自 Base
类,并尝试访问基类成员。通过例子可以看出,public成员可以被任何地方访问,private成员只能被类内部访问,而protected成员可以被类内部和派生类访问。
4. 使用注意事项
- 合理使用访问修饰符:保护类的内部状态,只暴露必要的接口。
- 初始化和清理:正确使用构造函数和析构函数。
- 避免过度封装:适当的封装可以提高代码的可读性和可维护性,但过度封装可能导致代码复杂度增加。
- 继承和组合的选择:根据实际情况选择继承或组合。
5. 代码示例
以下是一个简单的 C++ 类示例,用于表示一个矩形:
// 矩形类定义
class Rectangle {
private:float length; // 矩形的长float width; // 矩形的宽public:// 构造函数Rectangle(float l, float w) {length = l;width = w;}// 计算面积的方法float area() {return length * width;}// 计算周长的方法float perimeter() {return 2 * (length + width);}// 析构函数~Rectangle() {// 可以在这里进行清理工作}
};int main() {// 创建矩形对象Rectangle rect(10.0, 5.0);// 计算并输出面积std::cout << "面积: " << rect.area() << std::endl;// 计算并输出周长std::cout << "周长: " << rect.perimeter() << std::endl;return 0;
}
5.1 代码讲解
- 类定义:
class Rectangle
定义了一个名为Rectangle
的类。 - 私有成员:
private
下的length
和width
是矩形的属性,只能在类内部访问。 - 构造函数:
Rectangle(float l, float w)
是一个构造函数,用于初始化矩形的长和宽。 - 成员函数:
area()
和perimeter()
是成员函数,分别用于计算矩形的面积和周长。 - 析构函数:
~Rectangle()
是析构函数,用于对象销毁前的清理工作。 - 创建对象:
Rectangle rect(10.0, 5.0);
创建了一个Rectangle
类的对象rect
。 - 调用成员函数:通过
rect.area()
和rect.perimeter()
调用对象的成员函数,计算并输出面积和周长。
相关文章:
【C++】类的概念与基本使用介绍
C类是面向对象编程(OOP)的基础,它允许我们将数据(属性)和行为(方法)封装在一起,形成一个自定义的数据类型。以下是C类的基本概念、特点、特性以及使用注意事项,最后会提供…...
基于Python和OpenCV的图像处理的轮廓查找算法及显示
文章目录 概要轮廓查找算法示例代码代码解释小结 概要 在图像处理中,轮廓查找是一个重要的步骤,它可以帮助我们识别图像中的形状和边界。Python结合OpenCV库可以非常方便地实现这一功能。本文将详细介绍如何使用Python和OpenCV来查找图像中的轮廓&#…...

使用ant design的modal时,发现自定义组件的样式(组件高度)被改变了!
一 问题描述 在项目中,自定义了一个组件,分别在界面和 antd的modal中都有使用到。但是突然发现,界面中的组件样式跟modal中的组件样式高度不一样。modal中的组件整体要比页面中的组件要高一点。 项目中的自定义组件比较复杂,因此&…...

NLP从零开始------8文本进阶处理之文本向量化
1. 文本向量化概述 随着计算机计算能力的大幅度提升,机器学习和深度学习都取得了长足的发展。NLP越来越多的通过应用机器学习和深度学习工具解决问题,例如通过深度学习模型从网络新闻报道中分析出关键词汇与舆论主题并构建关系图谱。在这种背景下&#x…...

【网络编程】字节序,IP地址、点分十进制、TCP与UDP的异同
记录学习,思维导图绘制 目录 1、字节序编辑 2、IP地址 3、点分十进制 4、TCP与UDP的异同 1、字节序 2、IP地址 3、点分十进制 4、TCP与UDP的异同...

关于k8s的pvc存储卷
目录 1.PVC 和 PV 1.1 PV 1.2 PVC 1.3 StorageClass 1.4 PV和PVC的生命周期 2.实战演练 2.1 创建静态pv 2.2 创建动态pv 3.总结 1.PVC 和 PV 1.1 PV PV 全称叫做 Persistent Volume,持久化存储卷。它是用来描述或者说用来定义一个存储卷的,…...
【物联网设备端开发】ESP开发工具:QEMU的使用方法
概要 本文提供了一些运行QEMU的ESP特定说明。有关QEMU的一般使用问题,请参阅官方文档:https://www.qemu.org/documentation/. 编译 QEMU 准备工作 在此之前,请查看有关构建先决条件的QEMU文档。如果你在Linux主机上构建QEMU,你…...
c++中std::endl 和“\n“ 这两个换行符有什么区别
std::endl 和 "\n" 都用于在C中生成换行符,但它们之间有一些重要的区别 std::endl: 功能:输出一个换行符,并刷新输出流(即缓冲区)。作用:确保所有数据立即输出到目的地,例…...

http中get和post怎么选
5.4.2.怎么选择1.如果你是想从服务器上获取资源,建议使用GET请求,如果你这个请求是为了向服务器提交数据,建议使用POST请求。2.大部分的form表单提交,都是post方式,因为form表单中要填写大量的数据,这些数据…...

数据分析及应用:快手直播间人员在线分析
目录 0 需求描述 1、进入直播间的高峰期为?(以进入用户数衡量) 2、晚上 11 点,哪个直播间的进入人数最多? 3、20:00-23:00,娱乐类、搞笑类,进入人数最多直播间分别是? 4、娱乐类、搞笑类,人均在线时长(退出时间-进入时间)最长的直播间分别是? 5、同时在线人数…...

【Python】nn.nn.CircularPad1、2、3d函数和nn.ConstantPad1、2、3d函数详解和示例
前言 在深度学习中,尤其是在处理图像、音频或其他多维数据时,数据填充(Padding)是一个常见的操作。填充不仅可以保持数据的空间维度,还能在卷积操作中避免信息丢失。PyTorch提供了多种填充方式,其中nn.Cir…...

LearnOpenGL——混合、面剔除
LearnOpenGL——混合、面剔除 混合 Blending一、丢弃片段 Alpha Test二、混合 Alpha Blending渲染顺序 面剔除一、环绕顺序二、面剔除 混合 Blending OpenGL中,混合(Blending)通常是实现物体透明度(Transparency)的一种技术。透明的物体可以是完全透明的࿰…...
视频网站为何热衷于SCDN
视频网站为何热衷于SCDN?随着互联网技术的飞速发展,视频网站已成为人们日常生活中不可或缺的一部分。无论是观看高清电影、热门剧集,还是直播体育赛事、游戏竞技,视频网站都以其丰富的内容和便捷的访问方式吸引了无数用户。然而&a…...

Redis与DataBase保持数据一致性
文章目录 1. 读取数据2. 写数据2.1 先操作缓存2.2 先操作数据库 在我们系统中缓存最常用的策略是:服务端需要同时维系DB和Cache,并且是以DB的结果为准, Cache-Aside Pattern(缓存分离模式、旁路缓存)。 1. 读取数据 当…...

解决 MacOS 连接公司 VPN 成功但是不能网络的问题
目录 解决办法2024 Mac mini 爆料 解决办法 操作比较简单,修改配置文件即可(如果没有则需要手动创建)。 sudo vim /etc/ppp/options在此文件下,加入 plugin L2TP.ppp: plugin L2TP.ppp如果文件里有l2tpnoipsec&…...

【Kubernetes】k8s集群之Pod容器资源限制和三种探针
目录 一、Pod容器的资源限制 1.资源限制 2.Pod 和容器的资源请求与限制 3.CPU 资源单位 4.内存资源单位 二、Pod容器的三种探针 1.探针的三种规则 2.Probe支持三种检查方法: 一、Pod容器的资源限制 1.资源限制 当定义 Pod 时可以选择性地为每个容器设定所…...

从古代驿站体系看软件安全管控@安全历史04
在古代,车、马都很慢,信息传递很不顺畅,中央的政令又是如何传达至地方的呢?实际上,很多朝代都有专门的驿站制度,可以保障全国各地的信息传递,对于维护统治和稳定有着关键作用。 若将国家比作一个…...

8.8 哈希表简单 1 Two Sum 141 Linked List Cycle
1 Two Sum class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {//给的target是目标sum 要返回vector<int> res(2,0);是在num中找加数//首先假设每个输入都是由唯一的结果,而且不适用相同的元素两次一共有n*(n-1)种…...

动态规划之——背包DP(完结篇)
文章目录 概要说明分组背包模板例题1思路code模板例题2思路code 有依赖的背包问题模板例题思路code 背包问题求方案数模板例题思路code 背包问题求具体方案模板例题思路code 概要说明 本文讲分组背包、有依赖的背包、 背包问题求方案数以及背包问题求具体方案 入门篇(01背包和…...

Advanced IP Scanner - 网络扫描工具介绍
Advanced IP Scanner 是一款免费、快速且用户友好的网络扫描工具。它能够帮助用户扫描局域网(LAN)中的所有设备,提供详细的设备信息,包括IP地址、MAC地址、设备名称和厂商信息。该工具对IT管理员和普通用户都非常有用,…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...