【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管理员和普通用户都非常有用,…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
