6.1 结构体概述(struct)
结构体(struct)是C++中用于自定义数据类型的一种机制,它允许将多个不同类型的变量(成员变量)组合在一起形成一个新的数据类型。结构体允许程序员创建一个包含不同数据类型的复合数据类型,并能够方便地使用这些数据。
例如:学生类有 stunum、name、age、sex、addr、phone等不同类型的属性;
对于以上数据类型进行定义
int stunum;
char name[20];
int age;
char sex;
char addr[30];
char phone[11];可以得到以上不同数据类型的成员变量,这些属性构成了一个学生这个基类对象。
6.1.1 结构体类型的定义
语法:
struct 结构体类型名
{
成员列表;
}; // 注意此处有分号
例如对应1中的问题进行定义一个结构体:
// 定义学生结构体
//系统不会为结构体类型开辟空间 只会为结构体类型定义的变量开辟空间
struct Student {
//int stunum = 1001; 此时是非法的,不要对结构体变量初始化(后续再结合C++11、17、20讲)
int stunum;//正常定义的结构体成员变量
char name[20];
int age;
char sex;
char addr[30];
char phone[11];
};//结构体成员拥有独立的内存空间
//定义结构体类型的变量
Student Tom;//Tom此时就是为结构体变量名,后续对该变量名进行操作
Student Jery;
千锋教育C++基础班笔记截图(后续此类截图不再声明)
6.2 结构体变量的操作
6.2.1 结构体变量的初始化
结构体变量的初始化 必须遵循成员的顺序以及成员自身的数据类型
下例中未初始化结构体,此时输出正常来说是乱码的,无效的,错误的一种输出。
接着我们进行初始化结构体变量:
骚操作:重载了<<
操作符,使其能够直接输出Student
结构体对象。当你调用cout << Tom;
时,重载的<<
操作符会被调用,从而实现直接输出结构体对象 Tom
的功能。
6.2.2 清空整个结构体变量
1.使用memset()函数清空
//函数原型
void* __cdecl memset(
_Out_writes_bytes_all_(_Size) void* _Dst,
_In_ int _Val,
_In_ size_t _Size
);//之前可能是这样的
void *memset(void *_Dst,int _Val,size_t _Size);
//将从_Dst开始的长度为_Size的所有字节赋值为_Val
扩展:_Out_writes_bytes_all_(_Size)
注解表示函数将使用参数向外写入指定数量的字节数据。这有助于编译器验证参数的使用方式,并帮助静态代码分析工具识别函数可能产生的影响。在这种情况下,memset
函数的_Out_writes_bytes_all_(_Size)
注解告诉编译器,_Dst
参数将用于向外写入_Size
字节的数据,这有助于编译器进行更准确的优化和分析。
案例:
struct Person {
int age;
char name[20];
};
Person person1 = {25, "Alice"};
//对于以上定义的结构初始化的变量进行清空
memset(&person, 0, sizeof(person)); // 将结构体所有成员的内存块都设置为 0
//此时的person1的参数尽管已经初始化过了,但使用memse后仍然是0或者空
使用上面章节的案例:进行memset清空操作
清空后:
2.逐个赋值
person.age = 0;
strcpy(person.name, "");
3.编写清空函数
void clearPerson(Person& person) {
person.age = 0;
strcpy(person.name, "");
}
6.2.3 键盘给结构体变量中成员赋值
注意:类型顺序输入别输入反了
6.2.4 可以单独操作结构体中成员
需要注意的是,单独操作时要注意遵循结构体自身的类型
6.2.5 相同类型的结构体变量之间赋值方法
方法1:
方法2:结构体类型一致直接赋值
方法3:使用memcpy函数,内存拷贝
6.3 结构体嵌套结构体
结构体嵌套结构体要注意一定要访问到最底层,下面的Student的结构体里面嵌套了Date,访问时候,先访问最外层的Student的lucy,然后再访问lucy里面的ob对象,在访问到year、month等变量。
6.4结构体数组
结构体数组:本质是数组,数组的元素为结构体变量