C++类和动态内存分配

目录

1. C++类的基本概念与使用

2. 动态内存分配与指针

3. 类与动态内存分配的结合应用

4. 注意事项与最佳实践

5.一个简单的示例代码


 

在C++编程中,类是一种重要的概念,它允许我们将数据和操作封装在一起,以实现更加模块化和可维护的代码。而动态内存分配则提供了在程序运行时动态创建和释放内存的能力,使我们能够更灵活地管理内存资源。本文将探讨C++类与动态内存分配的相关知识,并介绍如何在实际编程中正确使用它们。

1. C++类的基本概念与使用

类是C++中的一种用户定义类型,它可以包含数据成员和成员函数。通过类,我们可以将相关的数据和操作封装在一起,形成一个独立的实体。以下是一个简单的示例:

class Student {
private:
    int id;
    string name;
public:
    void setId(int studentId) {
        id = studentId;
    }
    void setName(string studentName) {
        name = studentName;
    }
    void display() {
        cout << "Student ID: " << id << endl;
        cout << "Student Name: " << name << endl;
    }
};

在上面的示例中,我们定义了一个名为Student的类,它有两个私有数据成员id和name,以及三个公有成员函数setId、setName和display。通过这些成员函数,我们可以设置和获取学生的ID和姓名,并展示学生的信息。

要使用类,我们需要先创建类的对象。例如:

Student s;
s.setId(123);
s.setName("John Doe");
s.display();

上述代码中,我们首先创建了一个名为s的Student对象,然后通过成员函数setId和setName设置对象的属性值,最后调用display函数来显示学生的信息。

2. 动态内存分配与指针

动态内存分配是指在程序运行时根据需要动态地申请和释放内存空间,以支持灵活的内存管理。在C++中,我们可以使用关键字new来进行动态内存分配,而关键字delete则用于释放已分配的内存。下面是一个示例:

int* p = new int; // 分配一个整型变量的内存空间
*p = 123; // 设置变量的值
cout << *p << endl; // 输出变量的值
delete p; // 释放内存空间

在上述代码中,我们首先使用new运算符动态地分配了一个整型变量的内存空间,并将其地址保存在指针变量p中。然后,我们通过解引用操作符*来访问该内存空间,并对其进行赋值操作。最后,通过delete运算符释放了该内存空间,以防止内存泄漏。

3. 类与动态内存分配的结合应用

类和动态内存分配可以结合使用,以实现更灵活的内存管理和对象的动态创建。例如,在类中使用动态内存分配可以避免对象大小固定的限制,并允许根据需要创建多个对象。以下是一个示例:

class Array {
private:
    int* data;
    int size;
public:
    Array(int arraySize) {
        size = arraySize;
        data = new int[size];
    }
    ~Array() {
        delete[] data;
    }
};

在上述代码中,我们定义了一个名为Array的类,它有两个成员变量data和size。构造函数Array(int arraySize)使用动态内存分配创建了一个大小为arraySize的整型数组,并将其地址保存在data指针中。析构函数~Array()则通过delete[]运算符释放了该数组的内存空间,以免造成内存泄漏。

通过使用类和动态内存分配,我们可以在程序运行时根据需要创建多个Array对象,每个对象拥有不同大小的数组。

4. 注意事项与最佳实践

在使用类和动态内存分配时,我们需要注意以下几点:

  • 在类中使用动态内存分配时,务必在析构函数中释放已分配的内存,以防止内存泄漏。
  • 在使用动态内存分配时,要确保在不需要使用该内存时及时释放,以避免内存泄漏和资源浪费。
  • 对于动态分配的内存空间,要注意处理异常情况,确保在出现异常时能正确释放已分配的内存。
  • 在设计类的时候,要合理地管理和使用动态内存分配,避免过度依赖动态内存,以确保程序的可维护性和性能。

总结: C++类与动态内存分配是面向对象编程中的重要概念,通过合理运用它们,我们可以写出更加模块化、可维护和灵活的代码。在使用类和动态内存分配时,我们需要注意正确释放内存、处理异常情况,并合理管理内存资源。通过深入理解和灵活运用C++类与动态内存分配,我们可以提高程序的效率和可靠性,实现更复杂的功能和需求。

5.一个简单的示例代码

实现了图书管理系统中的添加图书和查询图书功能,并使用了C++类和动态内存分配:

#include 
#include 
using namespace std;

// 定义Book类
class Book {
private:
    int id;
    string name;
    string author;
    string press;
    string isbn;
    double price;
public:
    // 构造函数
    Book(int bookId, string bookName, string bookAuthor, string bookPress, string bookIsbn, double bookPrice) {
        id = bookId;
        name = bookName;
        author = bookAuthor;
        press = bookPress;
        isbn = bookIsbn;
        price = bookPrice;
    }
    // 获取图书ID
    int getId() const {
        return id;
    }
    // 获取图书名称
    string getName() const {
        return name;
    }
    // 获取图书作者
    string getAuthor() const {
        return author;
    }
    // 获取图书出版社
    string getPress() const {
        return press;
    }
    // 获取图书ISBN号
    string getIsbn() const {
        return isbn;
    }
    // 获取图书价格
    double getPrice() const {
        return price;
    }
};

// 定义BookList类
class BookList {
private:
    Book** books;  // 二级指针
    int size;
public:
    // 构造函数
    BookList() {
        books = new Book*[10];  // 动态分配10个Book指针的内存空间
        size = 0;
    }
    // 添加图书
    void add(Book* book) {
        books[size++] = book;
    }
    // 查询图书
    Book* search(string keyword) const {
        for (int i = 0; i < size; i++) {
            if (books[i]->getName() == keyword || books[i]->getAuthor() == keyword || books[i]->getIsbn() == keyword) {
                return books[i];
            }
        }
        return nullptr;
    }
};

// 主函数
int main() {
    // 创建BookList对象
    BookList bookList;

    // 添加图书
    Book* book1 = new Book(1, "C++ Primer", "Stanley Lippman", "Addison-Wesley Professional", "978-0321714114", 89.99);
    bookList.add(book1);
    Book* book2 = new Book(2, "Effective C++", "Scott Meyers", "Addison-Wesley Professional", "978-0321334879", 54.99);
    bookList.add(book2);

    // 查询图书
    string keyword;
    cout << "请输入要查询的图书名称、作者或ISBN号:";
    cin >> keyword;
    Book* result = bookList.search(keyword);
    if (result != nullptr) {
        cout << "查询结果:" << endl;
        cout << "图书ID:" << result->getId() << endl;
        cout << "图书名称:" << result->getName() << endl;
        cout << "图书作者:" << result->getAuthor() << endl;
        cout << "图书出版社:" << result->getPress() << endl;
        cout << "图书ISBN号:" << result->getIsbn() << endl;
        cout << "图书价格:" << result->getPrice() << endl;
    } else {
        cout << "未找到符合条件的图书。" << endl;
    }

    // 释放内存
    delete book1;
    delete book2;

    return 0;
}

在上述代码中,我们定义了一个Book类来表示图书信息,包括ID、名称、作者、出版社、ISBN号和价格等属性。我们还定义了一个BookList类来表示图书列表,包含添加和查询图书的功能。在BookList类中,我们使用了二级指针books来动态分配内存空间,并使用add函数向列表中添加图书,使用search函数来查询符合条件的图书。在主函数中,我们创建了BookList对象,并添加了两本图书,然后根据关键字查询图书,最后释放了动态分配的内存空间。

需要注意的是,在程序中使用动态内存分配时,我们需要确保在不需要使用该内存时及时释放,以避免内存泄漏和资源浪费。在上述代码中,我们使用了delete运算符来释放动态分配的内存空间。

你可能感兴趣的:(C++的学习笔记,c++,开发语言)