38.结构体基本用法

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

×

喜欢就点赞,疼爱就打赏