MST

星途 面试题库

面试题:C++中构造函数与析构函数类型安全性的基础考量

请解释在C++中构造函数和析构函数如何保证对象成员变量类型的安全性。举例说明在构造函数中对传入参数进行类型检查以确保对象创建时状态的正确性,以及析构函数如何安全地释放不同类型的资源。
36.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

构造函数保证对象成员变量类型安全性

在C++ 中,构造函数用于初始化对象的成员变量。通过在构造函数中对传入参数进行类型检查,可以确保对象创建时状态的正确性。

例如,假设有一个 Rectangle 类,有两个成员变量 widthheight,它们应该是大于 0 的整数。构造函数可以这样写:

class Rectangle {
private:
    int width;
    int height;
public:
    Rectangle(int w, int h) {
        if (w > 0 && h > 0) {
            width = w;
            height = h;
        } else {
            // 处理错误,例如抛出异常
            throw std::invalid_argument("Width and height must be positive numbers.");
        }
    }
};

在上述代码中,构造函数检查传入的 wh 是否大于 0。如果不满足条件,抛出 std::invalid_argument 异常,防止对象处于不正确的状态。

析构函数安全释放不同类型的资源

析构函数用于在对象销毁时释放对象所占用的资源。对于不同类型的资源,析构函数会根据资源类型进行相应的释放操作。

  1. 内存资源:如果对象在构造函数中分配了堆内存,析构函数需要释放这些内存。
class MyClass {
private:
    int* data;
public:
    MyClass() {
        data = new int[10];
    }
    ~MyClass() {
        delete[] data;
    }
};

在这个例子中,构造函数使用 new 分配了一个包含 10 个 int 的数组。析构函数使用 delete[] 来释放这块内存,防止内存泄漏。

  1. 文件资源:如果对象打开了文件,析构函数需要关闭文件。
#include <fstream>
class FileHandler {
private:
    std::ofstream file;
public:
    FileHandler(const char* filename) {
        file.open(filename);
        if (!file.is_open()) {
            throw std::runtime_error("Could not open file.");
        }
    }
    ~FileHandler() {
        if (file.is_open()) {
            file.close();
        }
    }
};

这里构造函数打开文件,如果打开失败抛出异常。析构函数检查文件是否打开,如果打开则关闭文件,确保文件资源被正确释放。

通过以上方式,构造函数和析构函数分别在对象创建和销毁时保证了对象成员变量类型的安全性以及资源的安全释放。