一文讲明白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、 使用场景

  • 结构体的使用场景

    • 用于存储一组相关的数据,但没有复杂的操作和逻辑。
    • 当数据的封装比行为更重要时,例如在处理图形、坐标、日期等数据时。
    • 当你需要将数据序列化/反序列化为二进制或其他格式时。
    • 作为轻量级的数据容器,适用于性能要求较高的情况。
  • 类的使用场景

    • 当你需要封装数据并附加操作和行为时,类更适合,因为它允许你将数据和操作封装在一起。
    • 在面向对象编程中,用于建模现实世界的对象,例如人、车辆、银行账户等。
    • 当你需要使用继承和多态来实现代码的扩展和重用。
    • 为了实现更复杂的数据结构,如链表、树、图等。
  • 总结
      虽然结构体和类在某些方面很相似,但它们的默认行为、访问权限、使用场景以及是否支持面向对象编程的特性(如继承、多态等)都有明显的差异。在选择使用结构体还是类时,需要考虑你的代码的需求和设计目标。

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

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

相关文章

密码学学习笔记(二十一):SHA-256与HMAC、NMAC、KMAC

SHA-256 SHA-2是广泛应用的哈希函数&#xff0c;并且有不同的版本&#xff0c;这篇博客主要介绍SHA-256。 SHA-256算法满足了哈希函数的三个安全属性&#xff1a; 抗第一原像性 - 无法根据哈希函数的输出恢复其对应的输入。抗第二原像性 - 给定一个输入和它的哈希值&#xf…

【实战】十一、看板页面及任务组页面开发(五) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十七)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

Python WEB框架之FastAPI

Python WEB框架之FastAPI 今天想记录一下最近项目上一直在用的Python框架——FastAPI。 个人认为&#xff0c;FastAPI是我目前接触到的Python最好用的WEB框架&#xff0c;没有之一。 之前也使用过像Django、Flask等框架&#xff0c;但是Django就用起来太重了&#xff0c;各种…

SpringBoot+mybatis+pgsql多个数据源配置

一、配置文件 jdk环境&#xff1a;1.8 配置了双数据源springbootdruidpgsql&#xff0c;application.properties配置修改如下&#xff1a; #当前入库主数据库 spring.primary.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.primary.datasource.driver-class…

Python|爬虫和测试|selenium框架模拟登录示例(一)

前言&#xff1a; 上一篇文章Python|爬虫和测试|selenium框架的安装和初步使用&#xff08;一&#xff09;_晚风_END的博客-CSDN博客 大概介绍了一下selenium的安装和初步使用&#xff0c;主要是打开某个网站的主页&#xff0c;基本是最基础的东西&#xff0c;那么&#xff0c;…

如何使用CSS实现一个平滑滚动到页面顶部的效果(回到顶部按钮)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 平滑滚动到页面顶部的效果&#xff08;回到顶部按钮&#xff09;⭐ 创建HTML结构⭐ 编写CSS样式⭐ 编写JavaScript函数⭐ 添加滚动事件监听器⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右…

【golang】panic函数、recover函数以及defer语句

从panic被引发到程序终止运行的大致过程是什么&#xff1f; 大致过程&#xff1a; 某个函数中的某行代码有意无意地引发了一个panic。这时&#xff0c;初始的panic详情会被建立起来&#xff0c;并且该程序的控制权会立即从从行代码转移至调用其所属函数的那行代码上&#xff…

【原创】jmeter并发测试计划

bankQPS 创建线程组 设置并发参数 HTTP请求GET 添加HTTP请求 GET请求 查看结果树 HTTP请求 POST 添加HTTP请求 参数必须设置头信息格式&#xff1a; 添加HTTP头信息 查看结果树 可以选择&#xff0c;仅查看错误日志 汇总报告

华为数通方向HCIP-DataCom H12-821题库(单选题:81-100)

第81题 某公司新购入一台网络设备,作为网络管理员,初次配置该设备通常通过什么方式? A、FTP B、Telnet C、SNMP D、Console 口登录 答案: D 解析&#xff1a; 通常情况下&#xff0c;初次配置网络设备会通过Console口登录的方式进行。Console口是一种串口接口&#xff0c…

[Linux]进程控制

[Linux]进程控制 文章目录 [Linux]进程控制进程退出情况分类进程退出码的理解进程退出方式进程等待 进程退出情况分类 进程正常执行完成 运行结果正确运行结果错误 进程异常终止 – (进程产生错误后&#xff0c;收到了操作系统的信号) 进程退出码的理解 进程主体功能执行完毕…

提升Java开发效率:掌握HashMap的常见方法与基本原理

文章目录 前言一、概述1. 认识HashMap2. HashMap 的作用和重要性3. 简要讲解 HashMap 的基本原理和实现方式 二、了解 HashMap 创建及其的常见操作方法1. HashMap的创建2. 添加元素 put()3. 访问元素 get()4. 删除元素 remove()5. 计算大小 size()6. 迭代 HashMap for-each7.判…

Android相机-架构2

应用&#xff1a; 大概流程&#xff1a;open&#xff0c;创建session&#xff0c;发送request&#xff0c;得到captureresult CameraManager&#xff0c;获取系统服务CameraService&#xff0c;打开相机&#xff1a; 1&#xff09;openCamera&#xff1a;打开相机 获取相…

树莓派示例代码 点亮led灯 跑马灯 开关控制led 红外感应灯 超声波测距

树莓派示例代码 gpio代码 gpio介绍 GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;&#xff0c;通用型之输入输出的简称&#xff0c;功能类似8051的P0—P3&#xff0c;其接脚可以供使用者由程控自由使用&#xff0c;PIN脚依现实考量可作为通用输…

深度学习11:Transformer

目录 什么是 Transformer&#xff1f; Encoder Decoder Attention Self-Attention Context-Attention 什么是 Transformer&#xff08;微软研究院笨笨&#xff09; RNN和Transformer区别 Universal Transformer和Transformer 区别 什么是 Transformer&#xff1f; ​ …

tomcat版本升级

一、升级原由 因漏洞扫描发现生产环境中所使用的tomcat版本有高风险漏洞&#xff0c;评估后决定将其升级至当前系统最新版本 tomcat8.5.32升级至apache-tomcat-8.5.81.tar.gz&#xff0c;可到官网下载&#xff1a;https://archive.apache.org/dist/tomcat/tomcat-8/ 二、升级步…

习题练习 C语言(暑期第二弹)

编程能力小提升&#xff01; 前言一、表达式判断二、Assii码的理解应用三、循环跳出判断四、数字在升序数组中出现的次数五、整数转换六、循环语句的应用七、函数调用八、两个数组的交集九、C语言基础十、图片整理十一、数组的引用十二、数组的引用十三、字符个数统计十四、多数…

【考研数学】矩阵、向量与线性方程组解的关系梳理与讨论

文章目录 引言一、回顾二、梳理齐次线性方程组非齐次线性方程组 写在最后 引言 两个原因让我想写这篇文章&#xff0c;一是做矩阵题目的时候就发现这三货经常绑在一起&#xff0c;让人想去探寻其中奥秘&#xff1b;另一就是今天学了向量组的秩&#xff0c;让我想起来了之前遗留…

初阶数据结构(六)队列的介绍与实现

&#x1f493;博主csdn个人主页&#xff1a;小小unicorn&#x1f493; ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的学习足迹&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 栈 队列的介绍队列的概念&#xff1a;队…

H5商城公众号商城系统源码 积分兑换商城系统独立后台

网购商城系统源码 积分兑换商城系统源码 独立后台附教程 测试环境&#xff1a;NginxPHP7.0MySQL5.6thinkphp伪静态