C++ 结构体与动态数组详解
本节将深入探讨 C++ 中的结构体以及如何基于结构体实现动态数组。
结构体增强
C++ 结构体语法特性
C++ 语言对 C 语言的结构体进行了增强,允许在结构体内部定义成员函数。这意味着函数可以与它们操作的数据紧密关联,提高了代码的组织性和可读性。
#include <iostream>
using namespace std;
// 定义一个 Student 结构体
struct Student
{
int studentId;
char studentName[16];
int studentAge;
// 在结构体内部声明一个成员函数
void displayMessage()
{
cout << "这是一个学生信息测试函数。" << endl;
}
};
/*
在 C++ 中,结构体类型名可以直接是 struct 关键字后的名称。
遵循大驼峰命名法是常见的实践。
*/
int main()
{
// 直接使用结构体名作为数据类型声明变量
Student studentRecord = {101, "Alice", 20};
cout << "学号: " << studentRecord.studentId << endl;
cout << "姓名: " << studentRecord.studentName << endl;
cout << "年龄: " << studentRecord.studentAge << endl;
// 通过结构体变量调用其成员函数
studentRecord.displayMessage();
return 0;
}
C++ 结构体实现案例
该示例展示了如何在 C++ 中为结构体成员提供访问器(getters)和修改器(setters)方法,并演示了如何使用结构体指针进行动态内存管理和成员访问。
#include <iostream>
#include <cstring> // 用于 strcpy
#include <cstdlib> // 用于 calloc, free
using namespace std;
struct StudentInfo
{
int id;
char name[32];
int age;
// 声明成员函数
void updateId(int newId);
int retrieveId() const; // const 表示此函数不会修改对象状态
void updateName(const char *newName);
const char *retrieveName() const;
void updateAge(int newAge);
int retrieveAge() const;
};
// 使用作用域解析运算符 :: 实现结构体成员函数
void StudentInfo::updateId(int newId)
{
// this 指针指向调用该函数的对象实例
this->id = newId;
}
int StudentInfo::retrieveId() const
{
return id;
}
void StudentInfo::updateName(const char *newName)
{
// 使用 strcpy 复制字符串
strncpy(this->name, newName, sizeof(this->name) - 1);
this->name[sizeof(this->name) - 1] = '\0'; // 确保 null 终止
}
const char *StudentInfo::retrieveName() const
{
return name;
}
void StudentInfo::updateAge(int newAge)
{
this->age = newAge;
}
int StudentInfo::retrieveAge() const
{
return age;
}
int main()
{
// 使用 calloc 分配动态内存并初始化为零
StudentInfo *studentPtr = (StudentInfo *)calloc(1, sizeof(StudentInfo));
if (!studentPtr) {
cerr << "内存分配失败!" << endl;
return 1;
}
// 通过指针调用成员函数设置值
studentPtr->updateId(202);
studentPtr->updateName("Bob");
studentPtr->updateAge(22);
// 通过指针调用成员函数获取值并打印
cout << "学号: " << studentPtr->retrieveId() << endl;
cout << "姓名: " << studentPtr->retrieveName() << endl;
cout << "年龄: " << studentPtr->retrieveAge() << endl;
// 释放动态分配的内存
free(studentPtr);
studentPtr = NULL; // 将指针设为 NULL 以避免悬空指针
return 0;
}
动态数组实现
功能概述
动态数组是一种能够根据需要自动调整大小的数据结构。在本节中,我们将设计一个通用的动态数组结构体,该结构体可以存储指向特定类型(例如学生对象)的指针,并支持常见的"增、删、改、查"操作。
核心结构体设计
为了管理动态数组的容量和实际元素数量,我们在结构体中引入了 `capacity`(总容量)和 `count`(已用空间)成员。同时,它将存储指向 `Student` 对象的指针数组。
#include <vector> // 假设我们稍后会使用 STL vector 或自定义实现
// 定义默认初始容量
#define INITIAL_CAPACITY 10
// 假设 Student 结构体已定义,此处为占位符
struct Student { /* ... Student definition ... */ };
// 定义一个通用的动态数组结构体
struct DynamicArray
{
// 指向 Student 对象的指针数组
Student **elementPointers;
// 数组的总容量
int capacity;
// 数组中当前存储的有效元素数量
int count;
// 构造函数(可选,用于初始化)
DynamicArray(int initialCapacity = INITIAL_CAPACITY) : capacity(initialCapacity), count(0) {
elementPointers = new Student*[capacity];
}
// 析构函数(重要,用于释放内存)
~DynamicArray() {
delete[] elementPointers;
}
// 其他成员函数如 add, remove, get, set 等将在此处定义
};
学生数据定义(头文件和源文件)
以下是 `Student` 结构体的头文件 (`student.h`) 和实现文件 (`student.cpp`)。
student.h
#ifndef STUDENT_HEADER
#define STUDENT_HEADER
#include <string> // 使用 C++ 标准字符串
#include <iostream>
class Student {
private:
int studentId;
std::string studentName;
int studentAge;
public:
// 构造函数
Student(int id = 0, std::string name = "", int age = 0);
// Setter 方法
void setId(int id);
void setName(const std::string& name);
void setAge(int age);
// Getter 方法
int getId() const;
const std::string& getName() const;
int getAge() const;
// 示例:显示学生信息
void displayInfo() const;
};
#endif // STUDENT_HEADER
student.cpp
#include "student.h"
// 实现构造函数
Student::Student(int id, std::string name, int age) : studentId(id), studentName(name), studentAge(age) {}
// 实现 Setter 方法
void Student::setId(int id) {
this->studentId = id;
}
void Student::setName(const std::string& name) {
this->studentName = name;
}
void Student::setAge(int age) {
this->studentAge = age;
}
// 实现 Getter 方法
int Student::getId() const {
return studentId;
}
const std::string& Student::getName() const {
return studentName;
}
int Student::getAge() const {
return studentAge;
}
// 实现显示信息方法
void Student::displayInfo() const {
std::cout << "ID: " << studentId << ", Name: " << studentName << ", Age: " << studentAge << std::endl;
}