P10 C++类和结构体的区别

目录

 01 前言

02 struct 与 class格式上的区别

03 struct 与 class 使用上的区别

04 常用的代码风格


 01 前言

今天这期我们主要解决一个问题,就是 C++ 中的类和结构体有什么区别。

本期我们有两个术语,结构体 struct,它是 structure 的缩写,以及类 class。它们的用法看起来有点相似,很多人都会困惑他们之间的区别。你是应该使用 struct,还是应该使用一个 class,本期内容我们将搞清楚这些。

02 struct 与 class格式上的区别

看下图代码,一个类的成员默认为私有的(private)。这意味着如果我要做这样的事情,如果不加 public 的话,这里会得到一个错误。

编译器告诉我们 Player 类中的 platerX是不可访问的,因为它被标记为私有的(private)。如果我们想执行这段代码,我们必须在开始的位置必须写上 public。

#include <iostream>

class Player
{
public:
    int playerX, playerY;
};



int main()
{
    Player player;
    player.playerX = 10;
    return 0;
}

这就是区别的本质所在,默认情况下类是私有的,如果你不指定修改任何可见性,那默认值就是私有的私有的(private)。而在结构体中默认值却是公有的 (public) ,技术上讲这是类与结构的唯一区别。

如果把 class 改成 struct ,你可以试着运行上面的代码,一切就都好了

 如果我真的想让某些东西是私有的,在他们之前加上private这个关键字就可以了。

#include <iostream>

struct Player
{
    int playerX, playerY;
};

int main()
{
    Player player;
    player.playerX = 10;
    return 0;
}

这个就是两者的区别。非常简单,这就是他们的全部。

03 struct 与 class 使用上的区别

虽然从技术上讲他们可能没有太大区别,然而实际使用情况会有一些不同。

struct 结构体在 C++ 中继续存在的唯一原因,是因为它希望与 C 保持向后兼容性,因为C代码没有类,但是有结构体,如果我们去掉这个结构体关键字,就会失去兼容性,那样的话 C 的编译器就不知道什么是 struct。

当然它也可以很容易地解决这个问题,只需要用 #define 来查找,我们可以写一些类似于 #define 的东西来实现。

#include <iostream>
#define struct class


struct Player
{
public:
    int playerX, playerY;
};

int main()
{
    Player player;
    player.playerX = 10;
    return 0;
}

这样能得到 C 与 C++ 的某种兼容性,在理想情况下,这样应该能将代码中的 struct 替换成 class,也就只能是这样了,在实际情况中不会有更多的区别了。

所以语义上的不同以及人们如何看待它,或多或少取决于用法,如果没有区别,那什么时候使用 struct 或者 class,如果我想要所有的成员都是公共的而不想写 public 这个字,那我应该使用结构体吗?真的就是些这么微不足道的区别吗?的确如此,它真的就是那么微不足道。

正因为如此,人们都有自己对于 struct 以及 class 的理解和定义。这并没有什么正确或错误的答案,这个取决于你的编程风格。

04 常用的代码风格

从根本上说这个类,不管是用 class 还是 struct,都是代表这两个整形数的一种结构。这个就是它的核心。他不应该像之前的 Player 类一样的,包含大量功能,——这个 Player 类可能有一个 3D 模型,它可能会为这个 3D 模型处理渲染代码,它可能处理比如 Player 如何在地图上移动并接收键盘输入,所有这些,可能有很多功能。

如果我只是想用结构体表示一些数据,我将使用一个结构体,

#include <iostream>

struct Player
{
    int playerX, playerY;
};


int main()
{
    Player player;
    player.playerX = 10;
    return 0;
}

如果我想要一个大量功能的整个类,比如一个游戏世界或者一个 Player,或者其他可能也有需要继承的东西,所有这些系统,我将使用一个类。这也是我个人区分这两种类型的方法。

#include <iostream>

class Player_Class 
{
private:
    int playerX, playerY;
public:
    void setPlayerX(int x) { playerX = x; }
    void setPlayerY(int y) { playerY = y; }
};

int main()
{
    Player_Class player_class;
    player_class.setPlayerX(20);
    return 0;
}

再说一次,你可以在任何可以使用类的地方使用结构体,它们将以相同的方式工作。如果在C++中我更喜欢用类,因为C++的代码风格更适合面向对象,在写代码分析代码更清晰明了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/187442.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源vs闭源,处在大模型洪流中,向何处去?

文章目录 一、开源和闭源的优劣势比较1.1 开源优势1.2 闭源的优势 二、开源和闭源对大模型技术发展的影响2.1 数据共享2.2 算法创新2.3 业务拓展2.4 安全性和隐私2.5 社会责任和伦理 三、开源与闭源的商业模式比较3.1 盈利模式3.2 市场竞争3.3 用户生态3.4 创新速度 四&#xf…

2023.11.24 关于 请求转发 和 请求重定向 的区别

目录 请求转发&#xff08;forward&#xff09; 请求重定向&#xff08;redirect&#xff09; 二者区别 定义不同 请求方不同 数据共享不同 最终 URL 地址不同 代码实现不同 阅读下文之前 建议点击下方链接简单了解 Fiddle Fiddle 的安装与使用 请求转发&#xff08;fo…

tinyViT论文笔记

论文&#xff1a;https://arxiv.org/abs/2207.10666 GitHub&#xff1a;https://github.com/microsoft/Cream/tree/main/TinyViT 摘要 在计算机视觉任务中&#xff0c;视觉ViT由于其优秀的模型能力已经引起了极大关注。但是&#xff0c;由于大多数ViT模型的参数量巨大&#x…

prometheus|云原生|grafana-9.4.3版本的主题更改

一&#xff0c; grafana-9.4.3版本的主题更改 grafana-9.4.3版本应该是目前比较高的版本了&#xff0c;但不知道是什么原因&#xff0c;grafana的主题界面并不多&#xff0c;只有暗色&#xff0c;亮色和系统色三种 配置管理----首选项里可以看到 亮色&#xff1a; 暗色&…

jconsole的基本使用和死锁的检测

jconsole的基本使用和死锁的检测 因为jconsole是JDK自带的&#xff0c;所以安装了JDK就可以直接打开了。 1. 打开方式 cmd命令行打开&#xff1a;输入jconsole&#xff0c;然后按Enter JDK安装目录&#xff0c;bin目录下&#xff0c;双击即可打开 选择一个进程然后打开 可…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-4:内核控制与时间管理函数)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

Windows核心编程 线程

目录 线程概述 进程与线程的关系 线程调度原理 单核与多核的线程处理方式 多线程 线程相关API 线程分配 线程切换时 线程状态 线程退出 线程退出时做的事&#xff08;正常退出情况&#xff09; 线程概述 程序磁盘上的一个可执行文件&#xff08;由指令和数据等组成…

深入理解MySQL索引及事务

✏️✏️✏️今天给各位带来的是关于数据库索引以及事务方面的基础知识 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; 动动你们发财的小手&#…

redis持久化:RDB:和AOF

目录 RDB 持久化 1、修改配置文件&#xff1a;redis.conf 2、RDB模式自动触发保存快照 3、RDB模式手动触发保存快照 4、RDB的优缺点 AOF持久化 1、AOF持久化工作流程 2、修改配置文件开启AOF 3、AOF优缺点 4、AOF的重写机制原理 RDBAOF混合模式 redis持久化有两种方…

杰发科技AC7801——ADC软件触发的简单使用

前言 7801资料读起来不是很好理解&#xff0c;大概率是之前MTK的大佬写的。在此以简单的方式进行描述。我们做一个简单的规则组软件触发Demo。因为规则组通道只有一个数据寄存器&#xff0c;因此还需要用上DMA方式搬运数据到内存。 AC7801的ADC简介 7801的ADC是一种 12 位 逐…

机器学习-激活函数的直观理解

机器学习-激活函数的直观理解 在机器学习中&#xff0c;激活函数&#xff08;Activation Function&#xff09;是用于引入非线性特性的一种函数&#xff0c;它在神经网络的每个神经元上被应用。 如果不使用任何的激活函数&#xff0c;那么神经元的响应就是wxb&#xff0c;相当…

【数据库】数据库物理执行计划最基本操作-表扫描机制与可选路径,基于代价的评估模型以及模型参数的含义

物理执行计划基本操作符 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏…

十大排序算法中的插入排序和希尔排序

文章目录 &#x1f412;个人主页&#x1f3c5;算法思维框架&#x1f4d6;前言&#xff1a; &#x1f380;插入排序 时间复杂度O(n^2)&#x1f387;1. 算法步骤思想&#x1f387;2.动画实现&#x1f387; 3.代码实现 &#x1f380;希尔排序 时间复杂度O(n*logn~n^2)希尔排序的设…

sql查询优化实际案例

1、第一步&#xff1a;sql优化 正对于海量数据的查询优化&#xff0c;且外键关联比较多的情况&#xff0c;通常情况是下sql层面的优化&#xff0c;有些时候是由于sql不合理的编写导致&#xff0c;如尽量少使用sql内查询等 如&#xff1a;避免使用 left join (select * form …

如何打造垂直LLM的护城河

B2B人工智能初创企业的一个伟大策略是打造“垂直人工智能”产品&#xff1a;成为特定行业的人工智能助手&#xff0c;比如律师、金融服务、医生。 听起来很简单&#xff1a;你可以利用LLM的超能力&#xff0c;并将其应用于宠物行业的特定数据和用例。 这就是我们在Explain所做的…

量子计算的发展

目录 一、量子力学的发展历程二、量子计算的发展历程三、量子计算机的发展历程四、量子信息科学的发展 一、量子力学的发展历程 量子力学是现代物理学的一个基本分支&#xff0c;它的发展始于20世纪初。以下是量子力学发展的几个重要阶段&#xff1a; 普朗克&#xff08;1900&…

基于JavaWeb+SpringBoot+Vue医院管理系统小程序的设计和实现

基于JavaWebSpringBootVue医院管理系统小程序的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏[Java 源码获取 源码获取入口 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.1微信小程序 2 2.2 …

「Java开发中文指南」IntelliJ IDEA插件安装(一)

IntelliJ IDEA是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的Java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 插件扩展了Intel…

MYSQL基础知识之【创建,删除,选择数据库】

文章目录 前言MySQL 创建数据库使用 mysqladmin 创建数据库使用 PHP脚本 创建数据库 MySQL 删除数据库使用 mysqladmin 删除数据库使用PHP脚本删除数据库 MySQL 选择数据库从命令提示窗口中选择MySQL数据库使用PHP脚本选择MySQL数据库 后言 前言 hello world欢迎来到前端的新世…

网络层(IP协议)

文章目录 网络层IP协议IP协议报头32位源IP地址和目的IP地址:为了解决IP地址不够用的情况 IP地址管理子网掩码特殊IP 路由选择(简介) 网络层 网络层主要负责地址管理和路由选择.代表协议就是IP协议. IP协议 IP协议报头 4位版本: 4: 表示IPv4 ; 6: 表示IPv6 4位首部长度: 描述…