C++ 结构体(struct)

C++ 结构体(struct)

在C++编程语言中,结构体(struct)是一种强大的数据结构,它允许我们将不同类型的数据项组合成一个单一的类型。本文将深入探讨C++中结构体的相关知识点,并提供实际应用示例。

结构体的定义与特性

结构体是一种用户自定义的数据类型,它允许我们将多个变量组合在一起,这些变量可以是不同的数据类型。
结构体的定义通常如下所示:

struct StructName {
    DataType1 member1;
    DataType2 member2;
    // ...
};

在C++中,结构体与类(class)非常相似,主要区别在于默认的访问权限:结构体的成员默认是public,而类的成员默认是private

结构体的实例化与访问

结构体可以通过以下方式进行实例化:

StructName instanceName;

或者在声明时直接初始化:

StructName instanceName = {value1, value2};

访问结构体成员可以通过点(.)操作符:

instanceName.member1 = someValue;
DataType2 temp = instanceName.member2;

结构体与函数

结构体可以作为函数的参数传递,也可以作为函数的返回值。这使得结构体成为处理复杂数据的有力工具。

作为参数传递

void function(StructName param) {
    // 操作param
}

作为返回值

StructName function() {
    StructName result;
    // 初始化result
    return result;
}

结构体与数组

结构体可以作为数组的元素,这使得我们可以创建同类型数据项的集合。

StructName array[10];

指针与结构体

结构体指针允许我们访问和操作结构体变量的地址。这对于动态内存分配和复杂的数据操作非常有用。

StructName* ptr = &instanceName;

结构体的应用示例

简单的数据封装

#include <iostream>
using namespace std;

struct Point {
    int x, y;
};

int main() {
    Point p = {1, 2};
    cout << "Point coordinates: (" << p.x << ", " << p.y << ")" << endl;
    return 0;
}

复杂数据结构

#include <iostream>
using namespace std;

struct Book {
    string title;
    string author;
    int year;
};

int main() {
    Book library[3] = {
        {"The Great Gatsby", "F. Scott Fitzgerald", 1925},
        {"1984", "George Orwell", 1949},
        {"To Kill a Mockingbird", "Harper Lee", 1960}
    };

    for (int i = 0; i < 3; ++i) {
        cout << "Title: " << library[i].title
             << ", Author: " << library[i].author
             << ", Year: " << library[i].year << endl;
    }
    return 0;
}

C++ Struct 的优点

代码组织性更好:C++ Struct 可以将相关的变量和函数组合在一起,提高代码的组织性和可读性。
数据封装:C++ Struct 可以将数据封装在结构体中,提高数据的安全性和可靠性。
代码复用:C++ Struct 可以定义结构体函数,提高代码的复用性。

C++ Struct 的常见应用

数据库:C++ Struct 可以用于定义数据库中的表结构和记录结构。
文件操作:C++ Struct 可以用于定义文件中的数据结构和格式。
网络通信:C++ Struct 可以用于定义网络通信中的数据包结构和格式。
游戏开发:C++ Struct 可以用于定义游戏中的角色、物品和场景结构。

C/C++中的struct

特性C语言中的structC++语言中的struct
默认访问权限public(成员默认为公开)private(成员默认为私有)
包含函数/方法不支持支持(可以包含成员函数)
继承不支持支持(可以继承自其他struct或class)
构造函数和析构函数不支持支持(可以定义构造函数和析构函数)
内存对齐由编译器决定,不可控制可以通过#pragma pack控制
匿名结构体支持不支持
模板不支持支持(可以创建模板struct)
联合体和枚举支持支持(C++还支持enum class

structtypedef struct 联系与区别

structtypedef struct
定义方式定义一个结构体为一个结构体定义一个新的名称
使用方式必须使用 struct 关键字来引用该结构体可以直接使用新的名称来引用该结构体
类型名struct XXXXXX
例子struct Person { int age; char name[20]; };typedef struct { int age; char name[20]; } Person;
优点清晰地定义了结构体的类型使代码更简洁易读
缺点每次引用结构体时都需要使用 struct 关键字可能会导致类型名冲突
  1. struct 用于定义一个结构体。
  2. typedef struct 用于为一个结构体定义一个新的名称。
  3. struct 和 typedef struct 都可以用来定义结构体,但 typedef struct 更常用,因为它可以使代码更简洁易读。
  4. 当使用 struct 定义结构体时,必须使用 struct 关键字来引用该结构体,而当使用 typedef struct 定义结构体时,可以直接使用新的名称来引用该结构体。

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

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

相关文章

idea_常用设置

相关设置 项目的JDK设置out目录取消自动更新设置主题设置菜单和窗口字体大小滚轮调节字体大小显示行号与方法分隔符代码智能提示忽略大小写自动导包配置设置项目文件编码设置控制台的字符编码修改类头的文档注释信息设置自动编译 项目的JDK设置 File -> Project Structure -…

Redis的管道操作

在现代应用程序中&#xff0c;Redis作为一种高性能的内存数据库&#xff0c;被广泛用于缓存、消息队列、实时分析等场景。为了进一步提高Redis的性能&#xff0c;Redis提供了管道&#xff08;Pipeline&#xff09;操作&#xff0c;允许客户端将多个命令一次性发送到服务器&…

详解登录MySQL时出现SSL connection error: unknown error number错误

目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后&#xff0c;使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件&#xff0c;然后按下图所示添加配置 此时再…

E2、UML类图顺序图状态图实训

一、实验目的 在面向对象的设计里面&#xff0c;可维护性复用都是以面向对象设计原则为基础的&#xff0c;这些设计原则首先都是复用的原则&#xff0c;遵循这些设计原则可以有效地提高系统的复用性&#xff0c;同时提高系统的可维护性。在掌握面向对象七个设计原则基础上&…

Angular面试题汇总系列一

1. 如何理解Angular Signal Angular Signals is a system that granularly tracks how and where your state is used throughout an application, allowing the framework to optimize rendering updates. 什么是信号 信号是一个值的包装器&#xff0c;可以在该值发生变化时…

我要成为算法高手-递归篇

目录 题目1&#xff1a;汉诺塔题目2&#xff1a;合并两个有序链表题目3&#xff1a;反转链表题目4&#xff1a;两两交换链表中的结点题目5&#xff1a;Pow(x,n) 题目1&#xff1a;汉诺塔 面试题 08.06. 汉诺塔问题 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1…

【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)

第8章 数据仓库Hive的安装和使用 8.1 Hive的安装 8.1.1 下载安装文件 访问Hive官网&#xff08;http://www.apache.org/dyn/closer.cgi/hive/&#xff09;下载安装文件apache-hive-3.1.2-bin.tar.gz 下载完安装文件以后&#xff0c;需要对文件进行解压。按照Linux系统使用的…

js.二叉树的层序遍历2

链接&#xff1a;107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09…

kafka生产者和消费者命令的使用

kafka-console-producer.sh 生产数据 # 发送信息 指定topic即可 kafka-console-producer.sh \ --bootstrap-server bigdata01:9092 \ --topic topicA # 主题# 进程 29124 ConsoleProducer kafka-console-consumer.sh 消费数据 # 消费数据 kafka-console-consumer.sh \ --boo…

基于Springboot的心灵治愈交流平台系统的设计与实现

基于Springboot的心灵治愈交流平台系统 介绍 基于Springboot的心灵治愈交流平台系统&#xff0c;后端框架使用Springboot和mybatis&#xff0c;前端框架使用Vuehrml&#xff0c;数据库使用mysql&#xff0c;使用B/S架构实现前台用户系统和后台管理员系统&#xff0c;和不同级别…

从入门到精通数据结构----四大排序(上)

目录 首言&#xff1a; 1. 插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 3. 交换排序 3.1 冒泡排序 3.2 快排 结尾&#xff1a; 首言&#xff1a; 本篇文章主要介绍常见的四大排序&#xff1a;交换排序、选择排序、插入排序、归并排…

SpringCloud+SpringCloudAlibaba学习笔记

SpringCloud 服务注册中心 eureka ap 高可用 分布式容错 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency><groupId…

Sentinel服务保护

Sentinel是阿里巴巴开源的一款服务保护框架&#xff0c;目前已经加入SpringCloudAlibaba中。官方网站&#xff1a; home | Sentinel Sentinel 的使用可以分为两个部分: 核心库&#xff08;Jar包&#xff09;&#xff1a;不依赖任何框架/库&#xff0c;能够运行于 Java 8 及以…

【Redis 】Bitmap 使用

Redis Bitmap介绍 Redis Bitmap 是一种特殊的数据类型&#xff0c;它通过字符串类型键来存储一系列连续的二进制位&#xff08;bits&#xff09;&#xff0c;每个位可以独立地表示一个布尔值&#xff08;0 或 1&#xff09;。这种数据结构非常适合用于存储和操作大量二值状态的…

【spark-spring boot】学习笔记

目录 说明RDD学习RDD介绍RDD案例基于集合创建RDDRDD存入外部文件中 转换算子 操作map 操作说明案例 flatMap操作说明案例 filter 操作说明案例 groupBy 操作说明案例 distinct 操作说明案例 sortBy 操作说明案例 mapToPair 操作说明案例 mapValues操作说明案例 groupByKey操作说…

C++ 红黑树:红黑树的插入及应用(map与set的封装)

目录 红黑树 红黑树的概念 红黑树的性质 红黑树节点的定义 一、如果默认给黑色 二、如果默认给红色 红黑树的插入操作 1.按搜索树的规则进行插入 2.检测新节点插入后&#xff0c;红黑树的性质是否造到破坏 情况一&#xff1a;cur为红&#xff0c;parent为红&#xff…

elementUI非常规数据格式渲染复杂表格(副表头、合并单元格)

效果 数据源 前端代码 (展示以及表格处理/数据处理) 标签 <el-table :data"dataList" style"width: 100%" :span-method"objectSpanMethod"><template v-for"(item, index) in headers"><el-table-column prop"…

HTML详解(1)

1.HTML定义 HTML&#xff1a;超文本标记语言。超文本&#xff1a;通过链接可以把多个网页链接到一起标记&#xff1a;标签&#xff0c;带括号的文本后缀&#xff1a;.html 标签语法&#xff1a;<strong>需加粗文字</strong> 成对出现&#xff0c;中间包裹内容&l…

两数之和--leetcode100题

一&#xff0c;前置知识 1&#xff0c;vector向量 二&#xff0c;题目 1. 两数之和https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下…

微信小程序条件渲染与列表渲染的全面教程

微信小程序条件渲染与列表渲染的全面教程 引言 在微信小程序的开发中,条件渲染和列表渲染是构建动态用户界面的重要技术。通过条件渲染,我们可以根据不同的状态展示不同的内容,而列表渲染则使得我们能够高效地展示一组数据。本文将详细讲解这两种渲染方式的用法,结合实例…