结构体用法总结

news/2025/2/7 10:38:30/文章来源:https://www.cnblogs.com/wusixuan/p/18702197

1. 结构体的定义
结构体的定义使用 struct 关键字,其基本语法如下:

struct StructName {// 成员变量dataType1 member1;dataType2 member2;// ...
};

例如,定义一个表示学生信息的结构体:

[struct Student {]()
[    std::string name;]()
[    int age;]()
[    float score;]()
[};]()

2. 结构体变量的声明与初始化
2.1 声明结构体变量
可以在结构体定义之后声明结构体变量,也可以在定义结构体的同时声明变量。


// 在定义之后声明
Student s1;// 在定义的同时声明
struct Student {std::string name;int age;float score;
} s2;

2.2 初始化结构体变量
逐个成员初始化:

Student s3;
s3.name = "Alice";
s3.age = 20;
s3.score = 90.5;

使用初始化列表初始化:
Student s4 = {"Bob", 21, 85.0};
C++11 及以后版本支持列表初始化:
Student s5{"Charlie", 22, 78.5};
3. 访问结构体成员
使用点运算符(.)来访问结构体变量的成员。

std::cout << s4.name << std::endl;
std::cout << s4.age << std::endl;
std::cout << s4.score << std::endl;

4. 结构体作为函数参数
4.1 值传递
将结构体变量作为参数传递给函数时,会进行值拷贝

void printStudent(Student s) {std::cout << s.name << " " << s.age << " " << s.score << std::endl;
}int main() {Student s = {"David", 23, 92.0};printStudent(s);return 0;
}

4.2 引用传递
为了避免值拷贝带来的性能开销,可以使用引用传递。

void modifyStudent(Student& s) {s.score = 95.0;
}int main() {Student s = {"Eve", 24, 90.0};modifyStudent(s);std::cout << s.score << std::endl;return 0;
}

4.3 指针传递
也可以使用指针传递结构体变量。

void printStudentPtr(Student* s) {std::cout << s->name << " " << s->age << " " << s->score << std::endl;
}int main() {Student s = {"Frank", 25, 88.0};printStudentPtr(&s);return 0;
}

5. 结构体嵌套
结构体可以嵌套,即一个结构体的成员可以是另一个结构体。

struct Date {int year;int month;int day;
};struct Person {std::string name;Date birthday;
};int main() {Person p = {"Grace", {1990, 5, 15}};std::cout << p.name << " was born on " << p.birthday.year << "-" << p.birthday.month << "-" << p.birthday.day << std::endl;return 0;
}

6. 结构体数组
可以定义结构体数组,用于存储多个结构体对象。

Student students[3] = {{"Henry", 26, 87.0},{"Ivy", 27, 91.0},{"Jack", 28, 84.0}
};for (int i = 0; i < 3; ++i) {std::cout << students[i].name << std::endl;
}

步骤说明
定义结构体:使用 struct 关键字定义一个新的结构体类型,在结构体内部声明所需的成员变量。
使用结构体定义数组:就像定义普通数组一样,使用定义好的结构体类型来声明数组,同时可以选择对数组元素进行初始化。
示例代码

#include <iostream>
#include <string>// 步骤 1: 定义结构体
struct Book {std::string title;std::string author;int year;
};int main() {// 步骤 2: 使用结构体定义数组// 定义一个包含 3 个 Book 结构体元素的数组,并进行初始化Book library[3] = {{"The Great Gatsby", "F. Scott Fitzgerald", 1925},{"To Kill a Mockingbird", "Harper Lee", 1960},{"1984", "George Orwell", 1949}};// 遍历数组并输出每本书的信息for (int i = 0; i < 3; ++i) {std::cout << "Book " << i + 1 << ":\n";std::cout << "Title: " << library[i].title << "\n";std::cout << "Author: " << library[i].author << "\n";std::cout << "Year: " << library[i].year << "\n\n";}return 0;
}

其他注意事项
未初始化的数组:如果不进行初始化,数组元素的成员变量将具有未定义的值。例如:
Book library[3];
这里定义了一个包含 3 个 Book 结构体元素的数组,但没有对元素进行初始化,此时 library 数组中每个元素的 title、author 和 year 的值是不确定的。

动态数组:除了使用固定大小的数组,你还可以使用动态数组(如 std::vector)来存储结构体元素,这样可以在运行时动态调整数组的大小。示例如下:

#include <iostream>
#include <string>
#include <vector>struct Book {std::string title;std::string author;int year;
};int main() {std::vector<Book> library = {{"The Great Gatsby", "F. Scott Fitzgerald", 1925},{"To Kill a Mockingbird", "Harper Lee", 1960},{"1984", "George Orwell", 1949}};for (size_t i = 0; i < library.size(); ++i) {std::cout << "Book " << i + 1 << ":\n";std::cout << "Title: " << library[i].title << "\n";std::cout << "Author: " << library[i].author << "\n";std::cout << "Year: " << library[i].year << "\n\n";}return 0;
}

在这个示例中,使用 std::vector 来存储 Book 结构体元素,std::vector 可以根据需要动态调整大小,使用 push_back 方法可以向数组中添加新的元素。

7. 结构体中的成员函数
在 C++ 中,结构体可以包含成员函数,其用法和类的成员函数类似。

struct Rectangle {int width;int height;// 成员函数,计算矩形面积int area() {return width * height;}
};int main() {Rectangle r = {5, 10};std::cout << "Area: " << r.area() << std::endl;return 0;
}

8. 结构体和类的区别
在 C++ 中,结构体和类非常相似,主要区别在于默认的访问控制权限:
结构体的成员默认是公有的(public)。
类的成员默认是私有的(private)。
例如:

struct S {int a;  // 默认 public
};class C {int b;  // 默认 private
};

结构体在 C++ 中是一种非常灵活和实用的数据类型,可用于组织和管理相关的数据。通过合理使用结构体,可以使代码更加清晰和易于维护。

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

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

相关文章

SAP ABAP ISM_SD_GET_PRICING_CONDITIONS 订单价格定价

SAP ABAP ISM_SD_GET_PRICING_CONDITIONS 订单价格定价SAP ABAP ISM_SD_GET_PRICING_CONDITIONS 订单价格定价DATA km LIKE STANDARD TABLE OF konv WITH HEADER LINE.CALL FUNCTION ISM_SD_GET_PRICING_CONDITIONSEXPORTINGin_vbeln = 0010500001in_posnr = 010TABLESkonv_tab…

Godot Engine

Godot Docs – 4.3 branch — Godot Engine (4.3) documentation in English,Best Wish 不负年华

Python与PyCharm的工具安装

主要针对windows环境进行部署并且联通oracle: 第一步:安装python (注:python的版本选用要与oralce版本一致,目前安装版本使用python 3.10.x与oracle 版本cx_Oracle-8.3.0-cp310-cp310-win_amd64.whl(注:cp310代表oracle版本)一致) 安装教程链接(转载):https://blog.c…

spring之自动注入

XML配置文件 使用autowired属性来进行自动注入,如下所示,如果 autowire="byType那么spring会在所有对象中查找类型为Cat所需要的属性的类型的对象,假设cat中有一个属性是类Class1,那么spring会查找类Class1对应的对象,如果找到且只找到一个,那么进行注入,否则就注入…

训练手势数据分类模型-从手势图片——手势关键点坐标-通过关键点识别手势

数据集:从手势图片——>手势关键点坐标手势图片,获取手势关键点数据from XEdu.hub import Workflow as wf import numpy as npdef get_model_path():import ospath = os.path.dirname(os.path.abspath(__file__))model_path = os.path.join(path,model.onnx)return model_…

【数学】信息论之从熵、惊奇到交叉熵、KL散度和互信息

转自:https://www.cnblogs.com/justLittleStar/p/17322197.html 一、熵(PRML) 考虑将A地观测的一个随机变量x,编码后传输到B地。这个随机变量有8种可能的状态,每个状态都是等可能的。为了把x的值传给接收者,需要传输一个3-bits的消息。注意,这个变量的熵由下式给出:⾮均…

用多项式回归分析简单投掷数据-训练投石机数据预测模型

用多项式回归分析简单投掷数据 进阶实验:训练投石机数据预测模型 问题描述:(1)投掷角度不变,已知电机速度,如何得出实际投掷距离?(2)其电机速度(motor_speed)和投掷距离(distance)的对应关系有什么关系? 投掷角度不变,电 机速度与投掷距离 的数据集展示: 学习:i可以通过…

css背景模糊效果

下面是效果下面是实现代码<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-…

线性回归模型训练-训练温度传感器数据预测模型

基础实验:训练温度传感器数据预测模型 任务描述:LM35是科创作品制作中常用的温度传感器(1)已知电压值, 如何得出实际温度值?(2)输出电压(Sensor)和真实温度(Temperature)有什么关 系?请借助大模型生成这两列数据的关系图 /目录学习:可以通过机器学习,训练传感器数据预测模型…

【分享】银行业如何实现内外网文件传输,保持核心竞争力?

数据要素是数字经济的重要基石,也是国家经济安全的关键要素。银行业数据因其数据体量大、数据类型多、涉及主体庞大及应用场景复杂等天然特征,在数据流转上面临风险和挑战,包括法律法规层面、安全层面、效率层面等。为响应和落实国家层面对于金融行业网络安全的建设要求,同…

SMT32的HEX文件里加入固件版本的方法(转)

使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。 代码代码如下: //------------------------------------------------------------------------------#include <absacc.h>//------------------------------------------------------------------------------#d…

uniapp 自定义tabBar组件 custom-tab-bar

custom-tab-bar 自定义tabBar组件。 在小程序和App端,为提升性能,在 pages.json 里配置固定的原生tabBar。但在H5端,这一设计并不会提升性能。 同时,H5端尤其是PC宽屏,对tabBar的位置和样式有更灵活的需求,tabBar作为一级导航,更多的时候是在PC网页顶部而不是底部。 自定…