325
社区成员




对于熟悉C++的程序员来说,结构体(structured types,简称"结构"或"结构体")是一个不可或缺的工具,它允许我们将一组不同或相同类型的数据项组织成一个单一的实体。在C++中,结构体是一种用户自定义的数据类型,它可以帮助我们创建更有组织、更清晰的代码。
结构体在C++中的定义非常直接。使用struct
关键字,后跟结构体名称和一对大括号内的成员列表。每个成员(也称为字段)都有自己的类型和名称。如下所示,一个简单的结构体可以包含多种不同类型的数据:
struct Person {
std::string name;
int age;
float height;
float weight;
};
在上述例子中,我们定义了一个Person
结构体,它包含有关人的基本信息:姓名(name
)、年龄(age
)、身高(height
)和体重(weight
)。
定义了结构体类型之后,我们可以创建其变量(结构体的实例),如下所示:
Person person1;
person1.name = "Alice";
person1.age = 30;
person1.height = 5.5;
person1.weight = 120.0;
这里,person1
是Person
结构体类型的一个实例,我们通过.
操作符访问和赋值它的成员。
结构体在C++中与类(classes)非常相似。实际上,结构体和类的主要区别在于默认的访问权限和继承类型。结构体的成员和继承默认都是公开(public)的,而类的成员和继承默认是私有(private)的。
这意味着以下两个声明是等效的
struct Base {
int data;
};
class Base {
public:
int data;
};
但是,由于历史和传统原因,我们通常使用结构体来表示简单的数据结构,而将类用于需要封装和继承的更复杂的数据类型。
C++允许在结构体内部封装数据和函数,这使得它们可以作为创建自己的数据类型的强大工具。例如,我们可以给Person
结构体添加一个成员函数来打印个人信息:
struct Person {
std::string name;
int age;
float height;
float weight;
void print() {
std::cout << "Name: " << name << "\n";
std::cout << "Age: " << age << " years old\n";
std::cout << "Height: " << height << " inches\n";
std::cout << "Weight: " << weight << " pounds\n";
}
};
// Create an instance and use it
Person person1;
person1.name = "Alice";
person1.age = 30;
person1.height = 5.5;
person1.weight = 120.0;
// Call the print function
person1.print();
在这个示例中,我们添加了一个名为print
的成员函数,在控制台上打印该结构体实例的成员数据。
从C++11开始,结构体也可以包含构造函数、析构函数和其他类特性。我们可以定义构造函数来初始化结构体实例:
struct Person {
std::string name;
int age;
float height;
float weight;
// Constructor
Person(std::string n, int a, float h, float w)
: name(n), age(a), height(h), weight(w) {}
void print() {
// Same print function as above
}
};
// Create an instance using the constructor
Person person1("Alice", 30, 5.5, 120.0);
// Call the print function
person1.print();
这里,构造函数Person
允许我们在创建Person
结构体实例时初始化其成员变量。
结构体实例既可以在栈上创建,也可以在堆上创建。在堆上创建结构体实例需要使用new
关键字,并且通常与delete
一起使用以避免内存泄漏。
Person* person1 = new Person("Alice", 30, 5.5, 120.0);
person1->print(); // 使用箭头操作符来访问成员
delete person1; // 释放内存
在上面的代码中,我们使用指针person1
在堆上创建了一个Person
实例。
与类一样,结构体可以继承其他结构体,这允许创建复杂的对象层次结构。由于结构体默认的访问权限是公开的,使用继承会非常直观:
struct Employee : Person {
std::string position;
float salary;
// Constructor
Employee(std::string n, int a, float h, float w, std::string p, float s)
: Person(n, a, h, w), position(p), salary(s) {}
void print() {
// Call the base class print function
Person::print();
// Print the additional information
std::cout << "Position: " << position << "\n";
std::cout << "Salary: $" << salary << "\n";
}
};
// Create an instance and use it
Employee employee1("Bob", 25, 6.0, 150.0, "Programmer", 50000.0);
employee1.print();
在这个例子中,Employee
结构体继承了Person
结构体,并添加了新的成员position
和salary
以及覆盖了print
方法。
(很好写不动了)