一文讲明白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…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
