一文讲明白C++中的结构体Struct和类Class的区别以及使用场景
一文讲明白C++中的结构体Struct和类Class的区别以及使用场景
文章目录
- 一文讲明白C++中的结构体Struct和类Class的区别以及使用场景
- 一、C++中的结构体Struct
- 二、C++中的类Class
- 三、结构体Struct和类Class之间的区别以及各自使用场景
一、C++中的结构体Struct
在C++中,结构体(struct)是一种用于组合不同类型的数据成员的用户自定义数据类型。结构体允许你在一个单一的实体中存储多个不同类型的数据,并且可以根据需要自定义数据成员的布局和访问权限。下面是关于C++中结构体的详细解释:
- 1、声明结构体
你可以使用struct关键字来声明一个结构体。结构体的声明通常放在头文件或者全局命名空间中,以便在多个地方都可以使用。
struct Person {std::string name;int age;double height;
};
- 2、结构体成员
在结构体中,你可以定义多种不同类型的成员变量,这些变量称为数据成员。成员可以是基本数据类型、自定义的结构体、指针、数组等。
struct Rectangle {double width;double height;
};struct Student {std::string name;int age;double grades[5];Rectangle favoriteRectangle;
};
- 3、结构体实例化
你可以像创建基本类型变量一样创建结构体变量。结构体的数据成员可以通过.运算符访问。
Person person1;
person1.name = "Alice";
person1.age = 25;
person1.height = 1.75;
- 4、默认访问权限
在结构体中,数据成员的默认访问权限是public,这意味着它们可以在结构体外部直接访问。
struct Point {double x;double y;
};int main() {Point p;p.x = 10.0;p.y = 5.0;return 0;
}
- 5、成员函数
结构体也可以拥有成员函数,但它们的使用通常是限于简单的操作,而不是丰富的行为。成员函数在结构体内部声明和定义,可以访问结构体的数据成员。
struct Circle {double radius;double calculateArea() {return 3.14 * radius * radius;}
};int main() {Circle c;c.radius = 5.0;double area = c.calculateArea();return 0;
}
- 6、访问控制
C++11引入了结构体成员的访问控制修饰符(public、private、protected),允许你控制成员的访问权限。默认情况下,C++中的结构体成员是public的,但你也可以显式地指定不同的访问权限。
struct Example {int publicMember; // 默认是public
private:int privateMember;
public:void setPrivateMember(int value) {privateMember = value;}int getPrivateMember() {return privateMember;}
};
总之,C++中的结构体是一种方便的数据组织方式,允许你将不同类型的数据组合在一起。虽然结构体的默认访问权限是public,但你也可以使用访问控制修饰符来更好地控制结构体成员的可见性。对于简单的数据封装和轻量级的数据结构,结构体是一个很好的选择。
二、C++中的类Class
在C++中,类(class)是一种重要的概念,用于创建用户定义的数据类型,可以包含数据成员和成员函数,以实现数据的封装和操作。类是面向对象编程的核心,允许将数据和操作封装在一起,以创建更加模块化和可维护的代码。下面是关于C++中类的详细解释:
- 1、类的声明和定义
类的声明通常在头文件(.h 或 .hpp)中,而类的成员函数的定义则在源文件(.cpp)中。这种分离使得代码的组织更加清晰。
// Person.h
class Person {
private:std::string name;int age;public:Person(const std::string &n, int a);void displayInfo();
};
// Person.cpp
#include "Person.h"Person::Person(const std::string &n, int a) : name(n), age(a) {}void Person::displayInfo() {std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
- 2、构造函数和析构函数
类可以有构造函数用于初始化对象,以及析构函数用于在对象被销毁时进行清理工作。构造函数的名称与类名相同,没有返回值,可以有参数;析构函数的名称也与类名相同,前面加上一个波浪号(~)。
class Student {
private:std::string name;public:Student(const std::string &n);~Student();
};
- 3、成员函数
类可以拥有成员函数,这些函数用于操作和处理类的数据成员。成员函数可以在类的内部声明和定义,或者在类外部定义。
class Circle {
private:double radius;public:Circle(double r);double calculateArea();
};double Circle::calculateArea() {return 3.14 * radius * radius;
}
- 4、成员访问控制
类的成员可以通过访问控制符(public、private、protected)来控制其可见性和访问权限。默认情况下,类的成员的访问权限是private。
class Example {
private:int privateMember;
public:int publicMember;
protected:int protectedMember;
};
- 5、对象实例化
通过类的构造函数,可以创建类的对象实例。
Person person1("Alice", 25);
Circle circle1(5.0);
- 6、继承和多态
C++中的类支持继承和多态等面向对象的概念,允许你通过基类创建派生类,实现代码的扩展和重用。
class Shape {
public:virtual double calculateArea();
};class Rectangle : public Shape {
private:double width;double height;public:Rectangle(double w, double h);double calculateArea() override;
};
- 7、访问成员
类的成员可以通过对象的成员访问运算符(.)来访问。
Person person1("Alice", 25);
person1.displayInfo();
总结:C++中的类是面向对象编程的基础,它允许将数据和操作封装在一起,以实现模块化和可维护的代码。类可以包含构造函数、析构函数、成员函数、数据成员等。通过继承和多态等特性,类可以实现代码的扩展和重用。类的访问控制使得你可以控制成员的可见性,从而提高了代码的安全性和封装性。在实际开发中,类是一个非常有用的工具,用于组织复杂的数据和行为。
三、结构体Struct和类Class之间的区别以及各自使用场景
C++中的结构体(struct)和类(class)有一些相似之处,但也存在一些关键的区别。以下是结构体和类之间的主要区别:
1、默认访问权限:
- 结构体的成员默认访问权限是公共的(public),这意味着结构体的成员在外部可以直接访问。
- 类的成员默认访问权限是私有的(private),这意味着类的成员在外部不能直接访问,需要通过公共的成员函数来访问。
2、成员函数:
- 类可以包含成员函数,这些函数可以操作类的私有成员,并且可以实现类的行为和功能。
- 结构体也可以有成员函数,但是它们的主要目的是为了实现一些操作,而不是定义类似于类的行为。
3、继承:
- 类可以通过继承实现子类与父类之间的关系,可以使用公共、保护或私有继承来控制成员的访问权限。
- 结构体也可以继承,但由于其成员默认是公共的,继承可能导致访问权限问题。
4、构造函数和析构函数:
- 类可以拥有构造函数和析构函数,用于对象的初始化和清理。
- 结构体也可以有构造函数和析构函数,但是它们的使用场景通常是比较简单的数据封装。
5、默认成员访问标签(Access Labels):
- 在类中,可以使用访问标签(public、private、protected)来指定成员的访问权限。
- 在结构体中,无法使用访问标签来指定成员的访问权限,所有成员都默认是公共的。
6、 使用场景:
-
结构体的使用场景:
- 用于存储一组相关的数据,但没有复杂的操作和逻辑。
- 当数据的封装比行为更重要时,例如在处理图形、坐标、日期等数据时。
- 当你需要将数据序列化/反序列化为二进制或其他格式时。
- 作为轻量级的数据容器,适用于性能要求较高的情况。
-
类的使用场景:
- 当你需要封装数据并附加操作和行为时,类更适合,因为它允许你将数据和操作封装在一起。
- 在面向对象编程中,用于建模现实世界的对象,例如人、车辆、银行账户等。
- 当你需要使用继承和多态来实现代码的扩展和重用。
- 为了实现更复杂的数据结构,如链表、树、图等。
-
总结:
虽然结构体和类在某些方面很相似,但它们的默认行为、访问权限、使用场景以及是否支持面向对象编程的特性(如继承、多态等)都有明显的差异。在选择使用结构体还是类时,需要考虑你的代码的需求和设计目标。
相关文章:
一文讲明白C++中的结构体Struct和类Class的区别以及使用场景
一文讲明白C中的结构体Struct和类Class的区别以及使用场景 文章目录 一文讲明白C中的结构体Struct和类Class的区别以及使用场景一、C中的结构体Struct二、C中的类Class三、结构体Struct和类Class之间的区别以及各自使用场景 一、C中的结构体Struct 在C中,结构体&…...
etcd学习入门
etcd有哪些独特的特性 etcd作为一个分布式键值存储系统,具有一些独特的特性,使其在分布式系统中得到广泛应用。以下是etcd的一些独特特性: 一致性: etcd使用Raft一致性算法来确保数据的一致性和可靠性。Raft算法能够处理网络分区、节点故障和…...
pyqt点击按钮执行脚本
class NineGridApp(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle(测试常见的操作) self.setGeometry(100, 100, 1800, 1800) layout QGridLayout() # 创建一个3x3的二维数组 rows 3 cols 3 array_2d [[0 for _ …...

9.oracle中sign函数
在Oracle/PLSQL中, sign 函数返回一个数字的正负标志. 语法如下:sign( number ) number 要测试标志的数字. If number < 0, then sign returns -1. If number 0, then sign returns 0. If number > 0, then sign returns 1. 应用于: Oracle 8i, Oracle …...

LVS DR模式搭建
目录 一、DR模式概述 一、与NET模式的区别 二、操作命令图 三、搭建流程 一、首先配置三台虚拟机并配置环境(关闭防火墙,宽容模式) 二、ping通百度 三、在115.3的(lvs)虚拟机上安装 ipvsadm 四、调整ARP参数 五…...

jmeter传参base64卡顿如何解决
部分接口需要传图片base64格式参数,但是输入转为base64格式的图片参数,jmeter直接卡死,甚至电脑也卡死,此时,只需要去掉文件头描述:data:image/jpeg;base64, 即可...

JAVA-编程基础-10-集合
Lison <dreamlison163.com>, v1.0.0, 2023.04.23 JAVA-编程基础-10-集合 文章目录 JAVA-编程基础-10-集合List、Set、Map、队列全面解析ListArrayList创建ArrayList 向ArrayList中添加元素 List、Set、Map、队列全面解析 Java 集合框架可以分为两条大的支线:…...

Unity实现倒计时和获取系统时间
一:创建UGUI 1.创建Canvas画布组件,调节Canvas画布的分辨率等其他设置。我们可以把视图设置为2D模式下。 2.创建Text文本组件,取名为Timer计时器,我们调整Text文本组件的大小,用锚点设置Text文本组件的位置,并且设置好Text文本组件的颜色。 3.我们再创建一个Text文…...

Unity 之 Time.deltaTime 的详细介绍以及用法
文章目录 Time.deltaTime 是什么?Time.deltaTime 有什么用?移动游戏对象:控制动画播放速度:实现平滑的计时器和延时: Time.deltaTime 是什么? “DeltaTime”(也被称为 “Delta Time”ÿ…...
十四、Ubuntu中如何更换pip国内镜像源?以及设置软链接
前言:在配置之前,一定要给虚拟机拍照,以防万一!!! 1、安装pip3 输入: sudo apt-get install python3-pip2、建立软链接 输入: sudo ln -s /usr/bin/pip3 /usr/bin/pip一般会出现…...

Spring Boot+Atomikos进行多数据源的分布式事务管理详解和实例
文章目录 0.前言1.参考文档2.基础介绍3.步骤1. 添加依赖到你的pom.xml文件:2. 配置数据源及其对应的JPA实体管理器和事务管理器:3. Spring BootMyBatis集成Atomikos4. 在application.properties文件中配置数据源和JPA属性: 4.使用示例5.底层原理 0.前言 背景&#x…...
地上集装箱式村庄污水处理设备厂家价格
诸城市鑫淼环保小编带大家了解一下地上集装箱式村庄污水处理设备厂家价格 废水经水解酸化池后自流到生物接触氧化池,接触氧化法是一种好氧生物膜法工艺,微生物以生物膜形式及悬浮态生长于水中.它兼具活性污泥及生物滤池二者的特点.在生物接触氧化池中有机碳水化合物被分解成C0和…...

ASIC-WORLD Verilog(13)状态机FSM
写在前面 在自己准备写一些简单的verilog教程之前,参考了许多资料----Asic-World网站的这套verilog教程即是其一。这套教程写得极好,奈何没有中文,在下只好斗胆翻译过来(加点自己的理解)分享给大家。 这是网站原文&…...

设置微软Edge浏览器主页和新标签页,摆脱扰人和分散注意力的主页
默认情况下,Microsoft Edge会向您显示世界上最令人分心和讨厌的主页(也称为主屏幕)。微软不想只向你展示一个搜索框,也许还有一个漂亮的背景或一些你喜欢的网站的快捷方式,而是想在你面前扔一堆新闻标题和广告。 你可能会打开浏览器阅读电子邮件,结果被Microsoft Edge主…...

视频汇聚平台EasyCVR安防视频监控平台新增经纬度选取功能的详细介绍
视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、…...

HCIP-HCS华为私有云的使用
1、概述 HCS(HuaweiCoudStack)华为私有云:6.3 之前叫FusionSphere OpenStack,6.3.1 版本开始叫FusionCloud,6.5.1 版本开始叫HuaweiCloud Stack (HCS)华为私有云软件。 开源openstack,发放云主机的流程&am…...

深度学习1.卷积神经网络-CNN
目录 卷积神经网络 – CNN CNN 解决了什么问题? 需要处理的数据量太大 保留图像特征 人类的视觉原理 卷积神经网络-CNN 的基本原理 卷积——提取特征 池化层(下采样)——数据降维,避免过拟合 全连接层——输出结果 CNN …...

浏览器输入一个URL之后发生了什么?
URL解析DNS解析TCP连接TSL连接HTTP请求TCP挥手接收并解析响应 URL 解析 主要分为: 协议,eg http,https域名或者ip地址,eg www.baidu.com 域名相对于ip地址来说,更方便人们记忆,但是实际的网络传输中使用的是ip地址 端…...

uniapp 布局(自定义导航栏加固定高度的主要内容)
不想让整体页面出现滚动条 页面大致分为三部分,导航栏、主题内容、tabbar,不想让整个页面出现滚动条,只想让主要内容滚动。 我这里是直接用了uni.getSystemInfoSync(),整体分为两部分,自定义头部和滚动内容ÿ…...

android手机销售app(IDEA,SpringBoot,SSM,MySQL)+支付宝支付+全套视频教程
本项目亮点: 支付宝支付 eCharts柱状图图表数据统计 【项目功能介绍】 本系统包含后台管理和前端app双端系统,后台管理的功能包含: 登录, 退出, 修改管理员信息(基本信息与头像),资源管理,角色管理,资源权限分配,字典管理,用户管理,图书管理,订单管理,订单统计; a…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...

Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
Electron简介(附电子书学习资料)
一、什么是Electron? Electron 是一个由 GitHub 开发的 开源框架,允许开发者使用 Web技术(HTML、CSS、JavaScript) 构建跨平台的桌面应用程序(Windows、macOS、Linux)。它将 Chromium浏览器内核 和 Node.j…...
day51 python CBAM注意力
目录 一、CBAM 模块简介 二、CBAM 模块的实现 (一)通道注意力模块 (二)空间注意力模块 (三)CBAM 模块的组合 三、CBAM 模块的特性 四、CBAM 模块在 CNN 中的应用 一、CBAM 模块简介 在之前的探索中…...