深入理解C++结构体(Structs)

许泽松 2024-02-03 22:32:36

对于熟悉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;

这里,person1Person结构体类型的一个实例,我们通过.操作符访问和赋值它的成员。

结构体与类

结构体在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结构体,并添加了新的成员positionsalary以及覆盖了print方法。

(很好写不动了)

...全文
435 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

325

社区成员

发帖
与我相关
我的任务
社区描述
一个供Leaders学习交流的地方
c++javapython 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • 叫我胡萝北
  • CheungZzzc
  • szu_gexu
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧