在 C++ 中,类是一个关键概念,凭借其封装和继承的特性,能够助力程序员之间实现高效的分工协作,共同完成复杂的大型项目。我们先从最简单的概念入手,再进行更深层次的了解和应用。

1. 类的定义

类是用户自定义的一种数据类型,它将数据和对数据进行操作的成员函数封装在一起,用于表示现实世界中的事物或抽象概念。

1.1 类和函数有什么区别呢?

如果将程序比作一个工厂,函数就像是工厂中的各种机器,每台机器完成特定的任务;而类就像是工厂中的工人,他们不仅携带工具(成员变量),还掌握技能(成员函数),可以独立地完成复杂的任务。
如果是实现一个 独立的、简单的功能,且不需要管理状态,使用函数可能更合适。**如果功能涉及到 数据和行为的结合,并且需要管理状态,使用类会更合适。**如管理一个对象的状态,用户档案。还比如需要将数据和操作封装在一起,操作一些图形,文件。或者说需要较为复杂的继承,例如游戏角色的分化,从单纯的角色分化为主角和各类小怪。

1.2 类和函数的例子

让我们以一个银行账户的数据管理为例,如果我们只是使用函数的话,那么有以下代码:

#include <string>
#include <iostream>
using namespace std;int main()
{string liyang_name = "李阳"; // 李阳的账户名称string liyang_number = "12345678"; // " 账号long liyang_balance = 1000; // " 账户余额string zhouyan_name = "周燕"; // 周燕的账户名称string zhouyan_number = "87654321"; // " 账号long zhouyan_balance = 200; // " 账户余额liyang_balance -= 200; // 李阳取出 200 元zhouyan_balance += 100; // 周燕存入 100 元cout << "■李阳的账户:\"" << liyang_name << "\" (" << liyang_number << ") " << liyang_balance << "元\n";cout << "■周燕的账户:\"" << zhouyan_name << "\" (" << zhouyan_number << ") " << zhouyan_balance << "元\n";
}

在这里,我们想要用不同的账户进行存取,只能在变量名的命名中进行变化,每次都要建立新的变量,管理十分复杂。那么我们试着将账户看作一个类,这个类里面有各种成员,每个成员代表了不同的账户属性。当想要建立用户的账户时,就相当于建立了一个实体对象。每进行一次存取,就是存入一个数据,就只需要那么只需要操作这一个实体对象里面的数据即可。
类和函数的区别
如果我们使用类去存储数据,就可以使用下面的代码:

#include <string>
#include <iostream>
using namespace std;class Account {//声明类的名字和成员
public:// 先不用管,还没有学到string name;    // 账户名称string number;  // 账号long balance;   // 账户余额
};int main()
{Account liyang;    // 李阳的账户Account zhouyan;   // 周燕的账户liyang.name = "李阳";       // 李阳的账户名称liyang.number = "12345678"; // 账号liyang.balance = 1000;      // 账户余额zhouyan.name = "周燕";       // 周燕的账户名称zhouyan.number = "87654321"; // 账号zhouyan.balance = 200;      // 账户余额liyang.balance -= 200;      // 李阳取出200元zhouyan.balance += 100;     // 周燕存入100元cout << "■李阳的:账户" << liyang.name << " (" << liyang.number<< ") " << liyang.balance << "元\n";cout << "■周燕的账户:" << zhouyan.name << " (" << zhouyan.number<< ") " << zhouyan.balance << "元\n";
}

而怎样理解类和对象的关系呢?就可以概括为类是抽象的,而对象是类的实体。就是月饼模具和月饼本身的关系,而你想选择的馅料和饼皮材料便是对象的实体数据,不一样的材料,做出了不一样的月饼,也便有了不一样的月饼。

2. 类的成员-变量与函数

1.成员变量与成员函数

类的主体由成员变量成员函数组成,以上个银行账户管理系统的代码为例,这里面只有成员变量,并没有成员函数。那么我们每次存钱或者取钱的时候,要在main函数中手动进行加减余额,这相当于多了一次理解的规则,每次存入100元钱相当于要使用这个命令balance += 100,那么如果将这个命令直接变为语言可以理解的规则,我们直接使用deposit(100) (deposit英文释义:存入) 这个语句,就可以直接让银行余额变多100元了。这里就可以使用成员函数来实现这件事了。

//在类中写下存入函数void deposit(long amnt) {crnt_balance += amnt;}//在main函数中直接调存入函数zhouyan.deposit(100);   // 周燕存入100元

3. 公有成员函数与私有成员变量

类中的成员变量成员函数,它们通过访问限定符来控制外部对它们的访问权限, 分别为private(私有)、protected(受保护)或 public(公有)。私有成员只能在类的内部被访问。类的外部代码和派生类都不能直接访问私有成员。受保护成员只能在类的内部和派生类(子类)中被访问。类的外部代码不能直接访问受保护成员。公有成员可以在类的外部被访问。任何对象都可以直接访问公有成员。

这种分类并不是固定的,而是根据设计需求来决定的。不过,通常情况下,成员变量被声明为 private成员函数被声明为 public,这种设计有其合理性和优势。成员变量的私有保证了数据的封装性,外部代码不可以修改数据的类型;成员函数作为类的接口,可以通过外部代码与类的对象进行交互。

class Account {
private:string full_name;  // 账户名称string number;     // 账号long crnt_balance; // 账户余额public:// 返回账户名称string name() {return full_name;}// 返回账号string no() {return number;}// 返回账户余额long balance() {return crnt_balance;}// 存入void deposit(long amnt) {crnt_balance += amnt;}// 取出void withdraw(long amnt) {crnt_balance -= amnt;}
};

4. 构造函数

在成员函数中,必须要有的便是构造函数,构造函数是C++中的一种特殊函数,它在创建对象时自动被调用,用于初始化对象。构造函数的名称必须与类名相同,并且没有返回类型(包括void)。构造函数的主要作用是为对象的成员变量赋初值,确保对象在创建时处于一个已知的、有效的状态。

class Account {
private:string full_name;  // 账户名称string number;     // 账号long crnt_balance; // 账户余额public:// 构造函数Account(string name, string num, long amnt) {full_name = name;  // 账户名称number = num;      // 账号crnt_balance = amnt; // 账户余额}
};int main()
{Account liyang("李阳", "12345678", 1000);  // 初始化李阳的账户Account zhouyan("周燕", "87654321", 200);  // 初始化周燕的账户
/
}

5.完整的示例代码及其类的成员

// 银行账户类(第2版)及类的使用例程
#include <string>
#include <iostream>
using namespace std;class Account {
private:string full_name;  // 账户名称string number;     // 账号long crnt_balance; // 账户余额public:// 构造函数Account(string name, string num, long amnt) {full_name = name;  // 账户名称number = num;      // 账号crnt_balance = amnt; // 账户余额}// 返回账户名称string name() {return full_name;}// 返回账号string no() {return number;}// 返回账户余额long balance() {return crnt_balance;}// 存入void deposit(long amnt) {crnt_balance += amnt;}// 取出void withdraw(long amnt) {crnt_balance -= amnt;}
};int main()
{Account liyang("李阳", "12345678", 1000);  // 李阳的账户Account zhouyan("周燕", "87654321", 200);  // 周燕的账户liyang.withdraw(200);   // 李阳取出200元zhouyan.deposit(100);   // 周燕存入100元cout << "■李阳的账户:" << liyang.name() << " (" << liyang.no()<< ") " << liyang.balance() << "元\n";cout << "■周燕的账户:" << zhouyan.name() << " (" << zhouyan.no()<< ") " << zhouyan.balance() << "元\n";
}

类的成员

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

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

相关文章

什么是Hadoop Yarn

Hadoop YARN&#xff1a;分布式集群资源管理系统详解 1. 什么是YARN&#xff1f; YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Apache Hadoop 生态系统中的资源管理和作业调度系统&#xff0c;最初在 Hadoop 2.0 中引入&#xff0c;取代了 Hadoop 1.0 的…

项目开发中途遇到困难的解决方案

1. 正视困难&#xff0c;避免逃避 开发遇阻时&#xff0c;退缩会带来双重损失&#xff1a;既成为"失败者逃兵"&#xff0c;又损害职业信心1。 行动建议&#xff1a; 立即向团队透明化问题&#xff08;如进度延迟、技术瓶颈&#xff09;&#xff0c;避免问题滚雪球…

Blender硬表面建模篇收集学习建模过程中的Demo

c 齿轮 创建一个圆柱体&#xff0c;选择侧面的所有&#xff0c;然后进行隔断选择&#xff0c;两次挤出面&#xff0c;一次缩放面&#xff0c;通过圆柱面三次插入面缩放挤出得到齿轮中心&#xff0c;选中齿轮的锯齿中间&#xff0c;然后进行相同周长选择行选择齿与齿中间的面&…

Chromium 136 编译指南 macOS篇:获取源代码(四)

1. 引言 在现代软件开发的宏大版图中&#xff0c;源代码的获取往往标志着从理论探索向实践应用的关键转折。对于Chromium 136这样一个拥有超过2500万行代码、涉及数百个第三方库的超大规模开源项目而言&#xff0c;源代码的获取不仅仅是简单的文件下载&#xff0c;更是一个涉及…

OpenCV C++ 边缘检测与图像分割

一、边缘检测 在数字图像处理领域&#xff0c;边缘检测是一项至关重要的基础技术。它如同为图像赋予 “骨架”&#xff0c;帮助计算机快速识别图像中的物体轮廓、形状与结构&#xff0c;广泛应用于目标识别、图像分割、图像配准等多个领域。 1.1 概念 边缘检测的核心目标是找…

线段树(2025年6月14日)

原文 https://www.beiweidoge.top/132.html P1&#xff1a;求最大值1 题目描述 题目描述 小明给了你n个数字&#xff0c;你需要依次输出&#xff1a; 1到n的最大值&#xff0c;1到n/2的最大值&#xff0c;n/21到n的最大值&#xff0c;1到n/4的最大值&#xff0c;n/41到n/2…

渗透实战PortSwigger Labs AngularJS DOM XSS利用详解

本Lab学习到关于AngularJS的 xss 漏洞利用 直接输入回显页面&#xff0c;但是把<>进了 html 编码了 当我们输入{{11}}&#xff0c;没有当作字符处理&#xff0c;而是执行了 {{}} 是多种前端框架&#xff08;如 Vue、Angular、Django 模板等&#xff09;中常见的模板插值语…

Ubuntu 多网卡安全路由配置(SSH 不断线版)

Ubuntu 多网卡路由配置笔记&#xff08;内网 外网同时通&#xff09;&#xff08;SSH断线版&#xff09;文章浏览阅读386次&#xff0c;点赞4次&#xff0c;收藏5次。本文介绍了Ubuntu 如何配置双网卡设备的路由规则&#xff0c;使默认流量走外网&#xff08;192.168.2.0/24&a…

基于昇腾NPU部署llamafactory单机多卡微调Qwen3教程

1. 进入华为云 华为云首页 点击右上角控制台 2.进入ModelArts 点击搜索框->搜索“ModelArts”->选择AI开发平台ModelArts->进入平台后点击开发者空间 3.创建Notebook 3.1在开发者空间中点击Notebook->在西南贵阳一下点击创建Notebook 3.2进入创建Notebook页…

关于XES文件格式诸多问题

1. 格式类型是什么&#xff1f; case:concept:name (案例ID) - 必须是字符串类型concept:name (活动名称) - 字符串类型time:timestamp - 必须是datetime类型 2. 如何修改&#xff1f; data[case:concept:name] data[case:concept:name].astype(str)data[concept:name] data…

数据融合平台有哪些?在数据治理中发挥什么作用?

目录 一、常见的数据融合平台 &#xff08;一&#xff09;传统数据融合平台 &#xff08;二&#xff09;实时数据融合平台 &#xff08;三&#xff09;云数据融合平台 二、数据融合平台在数据治理中的作用 &#xff08;一&#xff09;提升数据质量 &#xff08;二&#…

​​Linux:XFS 文件系统扩容完整指南

​​​问题背景​​ 在扩展 Linux 根目录 / 时,我遇到了一个错误: sudo resize2fs /dev/uos/root resize2fs: 超级块中的幻数有错 尝试打开 /dev/uos/root 时找不到有效的文件系统超级块。 经过排查,发现根本原因是 ​​文件系统类型是 XFS​​,而 resize2fs 仅适用于 e…

网络安全之CTF专题赛RE题解

easyre hap文件改成zip格式然后解压去反编译abc文件即可拿到源码 这里推荐一个网站.abcD 蛮好用的 下载反编译结果&#xff0c;解压后用vscode打开分析。 这里可以看到一些目录结构&#xff0c;我们先看看flag目录 x_2_2.count位1000000的时候就会输出flag那么大概率是一个点…

a padding to disable MSIE and Chrome friendly error page

问题 a padding to disable MSIE and Chrome friendly error page 解决 nginx 代理地址 配错了

71、C# Parallel.ForEach 详解

Parallel.ForEach 是 .NET Framework 4.0 引入的并行编程功能的一部分&#xff0c;位于 System.Threading.Tasks 命名空间中。它允许你对集合中的元素进行并行处理&#xff0c;可以显著提高处理大量数据时的性能。 基本用法 using System; using System.Collections.Generic;…

生产者-消费者模式在不同操作系统上的行为差异

在多线程编程中&#xff0c;生产者-消费者模式是一种常见的设计模式&#xff0c;用于解决线程间的数据同步问题。最近&#xff0c;我在 Linux 和 macOS 上运行同一个生产者-消费者模式的程序时&#xff0c;发现它们表现出不同的行为。本文将介绍这个现象、分析其原因&#xff0…

【JS-4.1-DOM获取元素操作】深入理解DOM操作:高效获取页面元素的方法与实践

在现代Web开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;操作是前端工程师的必备技能。而DOM操作的第一步&#xff0c;往往是从页面中获取我们需要操作的元素。本文将全面介绍各种获取页面元素的方法&#xff0c;分析它们的性能特点&#xff0c;并提供最佳实践建议…

UE5错误 Linux离线状态下错误 请求失败libcurl错误:6无法解析主机名

UE5错误 Linux离线状态下错误 请求失败libcurl错误&#xff1a;6无法解析主机名 完整描述问题解析解决方法 完整描述 loghttp&#xff1a;warning&#xff1a;ox015cba21400:request failed libcurl error :6 (couldn’t resolve host name ) 问题解析 这是因为在离线状态下…

深度学习实战111-基于神经网络的A股、美股、黄金对冲投资策略(PyTorch LSTM)

文章目录 一、A股与美股对冲互补投资方案1. 现象与逻辑2. 对冲互补投资思路3. 资金分配样例4. 最大化收益的关键二、对冲互补投资思路1. 资金分配原则2. 动态调整机制3. 对冲操作三、投资方案样例1. 初始资金分配(假设总资金10万元)2. 动态调整举例情景一:美股进入牛市,A股…

在线教育平台敏捷开发项目

项目背景 产品名称&#xff1a;LearnFlow&#xff08;在线学习平台&#xff09; 核心目标&#xff1a;6个月内上线MVP&#xff08;最小可行产品&#xff09;&#xff0c;支持课程学习、进度跟踪、测验功能。 团队构成&#xff1a; 产品负责人&#xff08;PO&#xff09;1人 S…