【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管理员和普通用户都非常有用,…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
