【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管理员和普通用户都非常有用,…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
