C++结构体教程

1. 什么是结构体?

结构体(struct)是一种用户自定义的数据类型,它允许你将不同类型的数据组合在一起,形成一个新的复合数据类型。就像是一个“数据包裹”,里面可以装各种不同类型的“小数据”。

例如,如果你想描述一个学生的信息,学生有姓名(string类型)、年龄(int类型)和成绩(float类型),就可以用结构体把这些信息组合在一起,方便管理和使用。

2. 定义结构体

  • 基本语法
    • 定义结构体的基本语法如下:
    struct 结构体名 {
       数据类型 成员变量1;
       数据类型 成员变量2;
       // 可以有更多成员变量...
    };
    
    • 例如,定义一个表示学生信息的结构体:
    struct Student {
       std::string name;
       int age;
       float score;
    };
    
    • 这里定义了一个名为Student的结构体,它有三个成员变量:name(姓名)、age(年龄)和score(成绩)。

3. 声明和使用结构体变量

  • 声明变量
    • 声明结构体变量的方式和声明其他基本数据类型的变量类似。有两种常见的方式:
    • 方式一:先定义结构体,再声明变量
      • 例如,在定义了Student结构体后,可以这样声明变量:
      Student student1;
      
      • 这里声明了一个Student类型的变量student1,此时这个变量包含了nameagescore这三个成员变量,不过它们还没有被初始化,有默认的值(对于string类型是空字符串,int类型是0,float类型是0.0)。
    • 方式二:在定义结构体的同时声明变量
      • 可以这样写:
      struct Point {
         int x;
         int y;
      } point1, point2;
      
      • 这里定义了一个名为Point的结构体,同时声明了两个Point类型的变量point1point2
  • 访问成员变量
    • 可以使用“.”(点运算符)来访问结构体变量的成员变量。例如,对于前面声明的student1变量:
    student1.name = "Tom";
    student1.age = 18;
    student1.score = 90.5;
    
    • 这样就分别给student1nameagescore成员变量赋值了。也可以通过成员变量获取其值,例如:
    std::cout << "学生姓名:" << student1.name << ", 年龄:" << student1.age << ", 成绩:" << student1.score << std::endl;
    

4. 结构体数组

  • 定义和初始化
    • 可以定义一个结构体数组,就像定义普通数据类型的数组一样。例如,定义一个包含3个Student结构体的数组:
    Student students[3];
    
    • 也可以在定义时进行初始化,例如:
    Student students[3] = {
       {"Alice", 17, 85.0},
       {"Bob", 18, 90.0},
       {"Charlie", 19, 88.0}
    };
    
    • 这里初始化了一个Student结构体数组students,每个元素都是一个Student结构体,并且都有相应的初始值。
  • 访问结构体数组元素的成员变量
    • 可以通过下标访问结构体数组中的元素,然后再使用“.”运算符访问其成员变量。例如:
    std::cout << "第二个学生的姓名:" << students[1].name << std::endl;
    
    • 这会输出students数组中第二个元素(下标为1)的name成员变量的值。

5. 结构体作为函数参数

  • 传递方式
    • 结构体可以作为函数的参数进行传递,有两种常见的传递方式:值传递和引用传递。
    • 值传递
      • 例如,定义一个函数来打印学生信息:
      void printStudent(Student student) {
         std::cout << "姓名:" << student.name << ", 年龄:" << student.age << ", 成绩:" << student.score << std::endl;
      }
      
      • 当调用这个函数时,会将实参的值复制一份给形参。如果结构体比较大,这种复制可能会导致效率问题。
    • 引用传递
      • 可以这样定义函数:
      void printStudentRef(const Student& student) {
         std::cout << "姓名:" << student.name << ", 年龄:" << student.age << ", 成绩:" << student.score << std::endl;
      }
      
      • 这里使用了引用(&),并且加上了const关键字,表示这个函数不会修改传入的结构体。引用传递不会进行复制,效率更高,尤其是对于大型结构体。
  • 调用函数示例
    • 假设已经有了Student结构体变量student1,调用函数的方式如下:
    • 值传递调用
      printStudent(student1);
      
    • 引用传递调用
      printStudentRef(student1);
      

6. 结构体中的函数(成员函数)

  • 定义和使用
    • 结构体中也可以包含函数,这些函数称为成员函数。成员函数可以访问结构体的成员变量,方便对结构体进行操作。例如,给Student结构体添加一个成员函数来判断学生是否及格:
    struct Student {
       std::string name;
       int age;
       float score;
       bool isPass() {
          return score >= 60;
       }
    };
    
    • 可以这样使用这个成员函数:
    Student student2;
    student2.score = 70;
    if (student2.isPass()) {
       std::cout << student2.name << " 及格了。" << std::endl;
    }
    

7. 结构体的嵌套

  • 定义嵌套结构体
    • 结构体可以嵌套其他结构体,用于更复杂的数据组织。例如,定义一个表示日期的结构体和一个表示人的结构体,人的信息中包含出生日期:
    struct Date {
       int year;
       int month;
       int day;
    };
    struct Person {
       std::string name;
       int age;
       Date birthDate;
    };
    
    • 这里Person结构体嵌套了Date结构体,用于表示出生日期。
  • 访问嵌套结构体的成员变量
    • 可以通过连续使用“.”运算符来访问嵌套结构体的成员变量。例如,对于Person结构体的变量person1
    Person person1;
    person1.birthDate.year = 2000;
    person1.birthDate.month = 1;
    person1.birthDate.day = 1;
    
    • 这样就给person1birthDate成员(它是一个Date结构体)中的yearmonthday成员变量赋值了。

0 条评论

目前还没有评论...