目录
结构体基本概念
结构体定义和使用
结构体定义
创建结构体变量(实例)
使用结构体名称创建变量
使用赋值方式初始化结构体变量
定义结构体时顺便创建变量
使用匿名结构体创建变量
注意
结构体数组
结构体指针
结构体嵌套结构体
结构体做函数参数
结构体中使用 const
结构体是一种用户自定义的数据类型,用于将多个不同类型的数据组合在一起形成一个整体,可以同时包含不同类型的成员变量(也称为字段或属性)。
成员变量:结构体由多个成员变量组成,每个成员变量可以是不同的数据类型,例如整数、浮点数、字符等。成员变量表示结构体的属性或特征。
数据封装:结构体允许将相关的数据封装在一起,以便以单个实体的方式进行处理。通过结构体,可以将相关的数据组织在一起,提高代码的可读性和可维护性。
访问成员:可以使用成员选择运算符(
.
)来访问结构体的成员变量。通过指定结构体实例的名称,然后使用.
操作符,可以访问该结构体的特定成员。初始化:可以使用初始化列表或赋值操作符来初始化结构体的成员变量。可以通过为每个成员变量提供初始值,或者在定义结构体变量时使用赋值操作符,将初始值分配给成员变量。
传递参数:可以将结构体作为参数传递给函数,或者从函数返回结构体。这样可以方便地传递多个相关数据,并且可以避免使用多个参数来传递数据。
结构体提供了一种方便和灵活的方式来表示,组织和处理复杂的数据,使得代码更加模块化和可扩展。通过定义自己的结构体类型,可以根据实际需求创建适合的数据结构。在C++中,结构体的功能也得到了增强,可以包含成员函数、访问修饰符等,与类十分相近。
语法:
struct 结构体名 { 结构体成员列表 };
struct Person {
std::string name;
int age;
float height;
};
这是最基本也是最简单的方式,只需使用结构体名称并在后面跟上变量名即可创建结构体变量。这种方式创建的结构体变量的成员变量没有被初始化,其值可能是未定义的。
struct Person {
std::string name;
int age;
};
// 创建结构体变量
Person p1;
可以在创建结构体变量时使用赋值操作符
=
,并将结构体成员的初始值按顺序放在花括号内,通过花括号分隔各个成员的值来初始化结构体变量。
struct Person {
std::string name;
int age;
};
// 创建结构体变量并初始化
Person p2 = { "Alice", 25 };
在定义结构体本身的同时,可以顺便定义(并初始化)一个结构体变量。这种方式比较简洁,适用于结构体定义和结构体变量的创建在同一行完成的情况。
struct Persons {
std::string name;
int age;
} p4,p5,p6;//顺便创建变量
struct Person {
std::string name;
int age;
} p3 = {"Bob", 30};//顺便创建变量并初始化
以使用匿名结构体来定义并创建结构体变量,省略结构体名称。这样的定义方式称为匿名结构体。
// 使用匿名结构体定义并创建结构体变量
struct {
std::string name;
int age;
} person = { "Alice", 25 };
由于匿名结构体没有名称,无法再创建其他相同类型的变量。所以,匿名结构体适用于只需要创建一个独立的结构体变量的情况。此外,匿名结构体不支持结构体的重用和成员函数的定义,因为无法引用它们的类型。如果需要在多个地方使用相同的结构体类型,还是建议给结构体命名并使用具名结构体来定义。
定义结构体时的关键字是struct,不可省略
创建结构体变量时,关键字struct可以省略
结构体数组是指将结构体类型的变量组织在一起形成数组的数据结构(就是将自定义的结构体放入到数组中,方便维护 ),可以通过定义一个包含多个结构体元素的数组来创建结构体数组。
struct 结构体名 数组名[元素个数] = { {} , {} , ... {} }
在定义上与定义一个结构体差不多,只多了[元素个数],结构体数组中的每个元素都是一个独立的结构体变量,可以通过索引进行访问和修改,即使用索引可以当成实例化的一个结构体一样使用。
#include
#include
struct Person {
std::string name;
int age;
};
int main() {
const int SIZE = 3; // 结构体数组大小
// 定义结构体数组并初始化
Person people[SIZE] = {
{ "Alice", 25 },
{ "Bob", 30 },
{ "Charlie", 35 }
};
// 遍历结构体数组并输出每个元素
for (int i = 0; i < SIZE; ++i) {
std::cout << "Person " << i+1 << ":" << std::endl;
std::cout << "Name: " << people[i].name << std::endl;
std::cout << "Age: " << people[i].age << std::endl;
std::cout << std::endl;
}
return 0;
}
结构体指针是指向结构体类型的指针变量。通过结构体指针,可以方便地操作和访问结构体的成员变量。
结构体指针可以通过 -> 操作符 来访问结构体中的成员
#include
#include
struct Person {
std::string name;
int age;
};
int main() {
// 声明结构体指针
Person* p;
// 创建动态分配的结构体对象,并将指针指向它
p = new Person;
// 通过指针访问和修改结构体成员
p->name = "Alice";
p->age = 25;
// 输出结构体成员
std::cout << "Name: " << p->name << std::endl;
std::cout << "Age: " << p->age << std::endl;
// 释放内存
delete p;
return 0;
}
结构体嵌套结构体是指在一个结构体中使用另一个结构体作为成员变量的情况。通过结构体嵌套,可以创建更复杂的数据结构来表示实际问题。
#include
#include
// 定义日期结构体
struct Date {
int day;
int month;
int year;
};
// 定义学生结构体,其中包含日期类型的成员变量
struct Student {
std::string name;
int age;
Date birthday;
};
int main() {
// 创建一个学生对象并初始化
Student s;
s.name = "Alice";
s.age = 20;
s.birthday.day = 10;
s.birthday.month = 5;
s.birthday.year = 2000;
// 输出学生信息
std::cout << "Name: " << s.name << std::endl;
std::cout << "Age: " << s.age << std::endl;
std::cout << "Birthday: " << s.birthday.year << "-" << s.birthday.month << "-" << s.birthday.day << std::endl;
return 0;
}
结构体可以作为函数参数传递,以便在函数内部操作和修改结构体的成员。当结构体较大或包含多个成员时,使用结构体作为参数可以避免传递多个单独的变量,提高代码的整洁性和可读性。
#include
#include
struct Person {
std::string name;
int age;
};
// 函数接受一个结构体类型的参数并修改其成员
void modifyPerson(Person& p) {
p.name = "Bob";
p.age = 30;
}
// 函数接受一个结构体类型的参数并打印其成员
void printPerson(const Person& p) {
std::cout << "Name: " << p.name << std::endl;
std::cout << "Age: " << p.age << std::endl;
}
int main() {
Person p;
p.name = "Alice";
p.age = 25;
printPerson(p); // 将结构体作为参数传递给函数,打印成员
modifyPerson(p); // 将结构体作为参数传递给函数,修改成员
printPerson(p); // 再次打印成员,已经被修改
return 0;
}
通过将结构体作为函数参数传递,可以方便地在函数内部操作和修改结构体的成员变量。同时,使用引用作为参数可以避免不必要的复制开销,提高程序的效率。注意:如果不想修改主函数中的数据,用值传递,反之用地址传递。
通过在结构体中使用
const
关键字,可以声明常量成员变量或者保证不会通过传进来的指针改变指针所指的值,以保证在对象创建后它们的值不会被修改。这有助于确保数据的不可变性和程序的稳定性。
//学生结构体定义
struct student
{
//成员列表
string name;//姓名
const age;//年龄,加const使其变成常量
int score;//分数
};
//const使用场景
void printStudent(const student *stu) //加const防止函数体中的误操作
{
//stu->age = 100; //操作失败,因为加了const修饰
cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu->score << endl;
}
int main() {
student stu = { "张三",18,100 };
printStudent(&stu);
system("pause");
return 0;
}