C++青少年简明教程:结构体
在C++中,结构体(struct)是一种复合数据类型,它可以包含多个不同类型的数据成员(例如整数、浮点数、字符串、其他结构体等)。结构体的主要用途是将一组逻辑相关的数据项组织在一起。结构体中的每个元素称为成员(member)。结构体主要用于处理具有多个属性的复杂数据结构。
定义结构体的基本语法如下:
struct StructName {
Type1 member1;
Type2 member2;
// ...
};
其中,StructName是你为结构体定义的名称,Type1和Type2是成员变量的类型,member1和member2是成员变量的名称。
阅读C++中的结构体资料时,常见的说法结构体变量,结构体对象、结构体实例基本上是指的同一件事情。这些术语都是指的由结构体定义创建的变量。在C++中,结构体是一种用户定义的数据类型,因此由结构体创建的变量也可以被视为对象(或实例)。例如:
假设有结构体定义:
struct Student {
std::string name;
int age;
float grade;
};
你可以使用这个结构体定义来创建一个结构体变量(或结构体对象,或结构体实例):
Student s;
创建结构体的实例后,就可以使用点运算符.来访问和调用结构体的成员。这包括结构体的数据成员和函数成员。
下面是一个具体的示例,定义了一个名为Student的结构体,包含了三个成员:name,age和grade。
#include <iostream>
#include <string>
using namespace std;struct Student {string name;int age;float grade;
};int main() {// 创建一个Student结构体的实例Student s;s.name = "John Doe";s.age = 20;s.grade = 3.7;// 输出Student结构体的信息cout << "Name: " << s.name << "\n";cout << "Age: " << s.age << "\n";cout << "Grade: " << s.grade << "\n";return 0;
}
在这个示例中,首先定义了一个Student结构体,然后在main函数中创建了一个Student的实例s,并为其成员赋值。然后,使用cout输出了Student实例的信息。其中使用.运算符来访问和设置s的数据成员name、age和grade。
注意,结构体的成员可以是任何类型,包括其他结构体。此外,结构体也可以包含函数【这些函数被称为成员函数(member function),成员函数可以访问结构体中的成员变量,并根据需要对这些变量进行操作】,这使得它们在功能上与类(class)非常相似。实际上,类和结构体的主要区别在于默认的访问级别:类的成员默认为私有(private),而结构体的成员默认为公有(public)。
下面是一个包含函数的结构体的例子:
#include <iostream>
#include <string>
using namespace std;struct Student {string name;int age;float grade;// 这是一个成员函数,它可以访问结构体的所有成员void print() {cout << "Name: " << name << "\n";cout << "Age: " << age << "\n";cout << "Grade: " << grade << "\n";}
};int main() {// 创建一个Student结构体的实例Student s;s.name = "John Doe";s.age = 20;s.grade = 3.7;// 使用成员函数输出Student结构体的信息s.print();return 0;
}
在这个例子中,我们在Student结构体中定义了一个名为print的成员函数,它可以直接访问并打印结构体的所有成员。然后,在main函数中,我们创建了一个Student的实例,并使用。运算符调用了print函数来打印学生的信息。
C++结构体可以作为函数参数或返回值,方便地在程序的不同部分传递相关数据。相比于传递多个独立变量,使用结构体更加简洁和高效。
下面是一个示例,演示如何使用结构体来传递数据,以及将结构体用作函数参数和返回值:
#include <iostream>
#include <string>
using namespace std;// 定义一个结构体,用于存储学生信息
struct Student {string name;int age;double gpa;
};// 函数声明,接受一个 Student 结构体并打印信息
void printStudentInfo(const Student& student) {cout << "Name: " << student.name << endl;cout << "Age: " << student.age << endl;cout << "GPA: " << student.gpa << endl;
}// 函数声明,返回一个 Student 结构体
Student createStudent(const string& name, int age, double gpa) {Student student;student.name = name;student.age = age;student.gpa = gpa;return student;
}int main() {// 创建一个 Student 结构体实例Student student1 = createStudent("Alice", 20, 3.8);// 打印学生信息printStudentInfo(student1);return 0;
}
输出结果:
Name: Alice
Age: 20
GPA: 3.8
下面给出一个求矩形面积和周长的示例
#include <iostream>
using namespace std;// 定义一个表示矩形的结构体
struct Rectangle {double width; // 矩形宽度double height; // 矩形高度// 成员函数:计算矩形面积double area() {return width * height;}// 成员函数:计算矩形周长double perimeter() {return 2 * (width + height);}
};int main() {Rectangle rect; // 创建一个Rectangle对象rect.width = 3.0; // 初始化widthrect.height = 4.0; // 初始化height// 调用成员函数double area = rect.area();double perim = rect.perimeter();// 输出结果std::cout << "Area: " << area << std::endl; // 输出 12.0std::cout << "Perimeter: " << perim << std::endl; // 输出 14.0return 0;
}
对上面程序改进,使用构造函数
构造函数是一种特殊的成员函数,它在创建对象时自动被调用,用于初始化对象的数据成员。构造函数在创建对象时必须被调用,如果没有提供构造函数,编译器会自动生成一个默认的无参构造函数。但是,如果你需要在对象创建时执行一些特殊的初始化操作,就必须自己定义构造函数。
构造函数是一个特殊的成员函数,它用于初始化对象。在C++中,构造函数的名字与类名(或结构体名)相同,并且没有返回类型(包括void)。对于上面的Rectangle结构体,如果你想添加一个构造函数来初始化宽度和高度:
Rectangle(double w, double h) : width(w), height(h) {}
解释一下:
Rectangle(double w, double h)定义了一个构造函数,它接收两个double类型的参数w和h。
width(w), height(h)是初始化列表,使用传入的w和h值初始化Rectangle类的width和height成员变量。
初始化列表的形式为:成员变量名(值)。
大括号{}内可以添加构造函数需要执行的其他操作,但这里是空的。
改进后的源码如下:
#include <iostream>
using namespace std;// 定义一个表示矩形的结构体
struct Rectangle {double width; // 矩形宽度double height; // 矩形高度// 构造函数Rectangle(double w, double h) : width(w), height(h) {}// 成员函数:计算矩形面积double area() {return width * height;}// 成员函数:计算矩形周长double perimeter() {return 2 * (width + height);}
};int main() {// 创建一个矩形对象Rectangle rect(3.0, 4.0);// 调用成员函数计算面积和周长double area = rect.area();double perim = rect.perimeter();// 输出结果cout << "Area: " << area << endl; // 输出 12.0cout << "Perimeter: " << perim << endl; // 输出 14.0return 0;
}
C++结构体(struct)小结
结构体允许将不同的数据类型组合成一个单一实体,使相关数据保持在一起,提高代码的可读性和可维护性。例如,可以使用结构体来表示一个学生的信息,包括姓名、年龄、成绩等。
结构体可以作为函数参数或返回值,方便地在程序的不同部分传递相关数据。相比于传递多个独立变量,使用结构体更加简洁和高效。
结构体源于C语言,C++完全兼容C语言中的结构体概念,C语言中的结构体不支持成员函数,但C++中的结构体可以包含成员函数。