38.结构体-结构体基本用法
38.1 知识点
基本概念
结构体是一种自定义变量类型,类似于枚举,需要自己定义。它是数据和函数的集合。在结构体中,可以声明各种变量和方法。
结构体的作用是用来表现存在关系的数据集合,比如用结构体表现学生、动物、人类等。
基本语法
结构体关键字是 struct
。
结构体声明
struct 自定义结构体名字
{
// 第一部分:变量
// 第二部分:构造函数和析构函数(可选)
// 第三部分:函数(方法)
};
在命名结构体时,通常使用帕斯卡命名法。
举例说明
struct Student
{
// 变量:表示学生的一些属性
int age;
bool sex;
int number;
string name;
// 结构体内可以声明自己类型的结构体变量,但一定是指针或引用,不能直接是自己,因为这样会导致无限嵌套
// Student s; // 编译报错
Student* s;
// 函数(方法):表示结构体的一些行为
void speak()
{
cout << "我的名字是" << name << "我今年" << age << "岁" << endl;
}
void sleep()
{
cout << "我睡觉了" << endl;
}
// 可以用多个方法(函数)去表现这个结构体的行为
} ss1 = {}, ss2 = { 18, true, 1,"韬老狮", nullptr }, * ss3 = nullptr;
声明对象语法
方式一:聚合初始化
聚合初始化允许通过大括号 {}
的方式直接对聚合类型的成员变量逐个赋值。
Student s1 = { 18, true, 1,"韬老狮", nullptr };
你可以选择初始化部分变量,其他未指定的变量会填充默认值,但也要按顺序进行初始化。
Student s11 = { 18 };
Student s111 = { 18, true };
我们不能直接跳过某些成员进行初始化,必须按顺序初始化:
// 编译报错
Student s1 = { 18, true,"韬老狮", nullptr };
方式二:直接声明
定义结构体类型的同时声明结构体变量:
struct Student
{
int age;
bool sex;
int number;
string name;
//...
} ss1 = {}, ss2 = { 18, true, 1,"韬老狮", nullptr }, * ss3 = nullptr;
方式三:匿名声明
省略结构体类型名,直接声明结构体类型变量:
struct {
int test1;
string test2;
void test()
{
cout << "123" << endl;
}
} test1 = { 1, "123" };
方式四:堆上声明
可以在堆上分配结构体对象,记得在使用后销毁释放:
Student* s_ptr = new Student{ 1, false };
// delete s_ptr;
// s_ptr = nullptr;
成员的使用
普通变量
通过 .
操作符访问成员。
//使用栈上结构体的成员
cout << s2.age << endl; // 18
cout << s2.sex << endl; // 1
cout << s2.number << endl; // 1
s2.name = "韬老狮s2";
cout << s2.name << endl; // 韬老狮s2
s2.s = s_ptr;
cout << s2.s << endl; // 000001B027B2B6E0 s_ptr指针存的地址
s2.speak(); // 我的名字是韬老狮s2我今年18岁
s2.sleep(); // 我睡觉了
指针变量
对于指针类型的结构体变量(不论栈还是堆上的结构体),需要使用 ->
操作符访问成员。
//使用堆上结构体的成员
cout << s_ptr->age << endl; // 1
cout << s_ptr->sex << endl; // false 0
cout << s_ptr->number << endl; // 0
s_ptr->name = "韬老狮s";
cout << s_ptr->name << endl; // 韬老狮s
cout << s_ptr->s << endl; // 0000000000000000 未赋值
s_ptr->speak(); // 我的名字是韬老狮我今年1岁
s_ptr->sleep(); // 我睡觉了
38.2 知识点代码
Lesson38_结构体_结构体基本用法.cpp
#include <iostream>
using namespace std;
#pragma region 知识点一 基本概念
//结构体 是一种自定义变量类型 类似枚举需要自己定义
//它是数据和函数的集合
//在结构体中 可以声明各种变量和方法
//作用:用来表现存在关系的数据集合 比如用结构体表现 学生 动物 人类 等等
#pragma endregion
#pragma region 知识点二 基本语法
//结构体关键字 struct
//结构体声明
//注意:结构体名字命名时 我们一般用帕斯卡命名法
//struct 自定义结构体名字
//{
// //第一部分
// //变量
//
// //第二部分
// //构造函数和析构函数(可选)
//
// //第三部分
// //函数(方法)
//};
//举例说明
struct Student
{
//变量 表示学生有的一些属性
//变量类型 可以写任意的类型 包括结构体(但是 不能是自己的结构体变量-指针和引用除外)
int age;
bool sex;
int number;
string name;
//可以声明自己类型的结构体变量 但一定是指针或者引用 不能直接是自己 因为这样会导致无限套娃
//Student s;//编译报错
Student* s;
//Student& s2;
//函数(方法)表示它的一些行为
void speak()
{
cout << "我的名字是" << name << "我今年" << age << "岁" << endl;
}
void sleep()
{
cout << "我睡觉了" << endl;
}
//可以用n多个方法(函数)去表现这个结构体的行为
} ss1 = {}, ss2 = { 18, true, 1,"韬老狮", nullptr }, * ss3 = nullptr;
#pragma endregion
#pragma region 知识点三 声明对象语法
//方式一:聚合初始化(数组初始化就是聚合初始化)
//在声明结构体对象后直接通过{}按变量顺序进行初始化
//聚合初始化允许通过大括号 {} 的方式直接对聚合类型的成员变量逐个赋值
Student s1 = { 18, true, 1,"韬老狮", nullptr };
//可以选择初始化部分 其他未指定初始化的变量会填充默认值 但是也要按顺序
Student s11 = { 18 };
Student s111 = { 18, true };
//我们不能够 直接跳过某一些成员进行初始化 不允许这样
//Student s1 = { 18, true,"韬老狮", nullptr };
//方式二:直接声明
//定义结构体类型的同时声明结构体变量
//直接在结构体类型声明的大括号后声明变量
//方式三:匿名声明
//省略结构体类型名
//直接声明结构体类型变量
struct {
int test1;
string test2;
void test()
{
cout << "123" << endl;
}
}test1 = { 1, "123" };
//方式四:堆上声明
//可以在堆上分配结构体对象
//一定记住销毁释放
#pragma endregion
#pragma region 知识点四 成员的使用
//1.普通变量
// 直接点(.)
//2.指针变量
// 只要是指针 不管栈还是堆上的 都需要用这个符号
// 直接指向(->)
#pragma endregion
int main()
{
std::cout << "结构体基本用法\n";
cout << "********************" << endl;
#pragma region 知识点三 声明对象语法
//堆上声明 一定记住销毁释放
Student* s_ptr = new Student{ 1, false };
//delete s_ptr;
//s_ptr = nullptr;
//栈上声明
Student s2 = { 18, true, 1 };
Student s3 = {};
#pragma endregion
cout << "********************" << endl;
#pragma region 知识点四 成员的使用
//使用堆上结构体的成员
cout << s_ptr->age << endl;//1
cout << s_ptr->sex << endl;//false 0
cout << s_ptr->number << endl;//0
s_ptr->name = "韬老狮s";
cout << s_ptr->name << endl;//韬老狮s
cout << s_ptr->s << endl; //0000000000000000 未赋值
s_ptr->speak();//我的名字是韬老狮我今年1岁
s_ptr->sleep();//我睡觉了
//使用栈上结构体的成员
cout << s2.age << endl;//18
cout << s2.sex << endl;//1
cout << s2.number << endl;//1
s2.name = "韬老狮s2";
cout << s2.name << endl;//韬老狮s2
s2.s = s_ptr;
cout << s2.s << endl;//000001B027B2B6E0 s_ptr指针存的地址
s2.speak();//我的名字是韬老狮s2我今年18岁
s2.sleep();//我睡觉了
#pragma endregion
delete s_ptr;
s_ptr = nullptr;
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com