📜  C ++ |构造函数|问题3(1)

📅  最后修改于: 2023-12-03 15:29:42.472000             🧑  作者: Mango

C++ | 构造函数 | 问题3

在C++中,构造函数是一个特殊的函数,用于创建和初始化类的对象。它具有与类相同的名称,并使用特殊的语法来定义。类的构造函数在对象创建时自动调用,并使对象处于一个合法的状态。

问题描述

本问题是一个关于C++中构造函数的问题。下面是一个简单的类的定义:

class Shape {
public:
    int x, y;
    ~Shape() {
        cout << "Destructor called" << endl;
    }
};

从上述代码中,我们可以看到,在Shape类中定义了一个析构函数。请问,在以下情况下,Shape类的析构函数会被调用?

  1. 创建一个Shape类的对象,并将其存储在栈上;
  2. 创建一个Shape类的对象,并将其存储在堆上;
  3. 在构造函数中显式调用析构函数。
解决方案
1. 创建一个Shape类的对象,并将其存储在栈上

在这种情况下,当Shape类的对象超出范围时,其析构函数会自动调用。这是由C++的自动存储管理机制实现的。

下面是一个示例代码:

int main() {
    Shape s;

    return 0;
}

在上述示例代码中,我们创建了一个Shape类的对象s,并将其存储在栈上。当程序退出main函数的作用域时,s的析构函数会被调用,输出Destructor called

2. 创建一个Shape类的对象,并将其存储在堆上

在这种情况下,当Shape类的对象被手动销毁时,其析构函数会被调用。这是由C++的手动存储管理机制实现的。

下面是一个示例代码:

int main() {
    Shape *s = new Shape();

    delete s;

    return 0;
}

在上述示例代码中,我们创建了一个Shape类的对象s,并将其存储在堆上。在调用delete时,s的析构函数会被调用,输出Destructor called

3. 在构造函数中显式调用析构函数

正如名称所示,析构函数是由系统自动调用的。在C++中,析构函数不能显式调用。

下面是一个示例代码,试图在构造函数中显式调用析构函数:

class Shape {
public:
    int x, y;
    Shape() {
        ~Shape();  // 错误:析构函数不能显式调用
    }
    ~Shape() {
        cout << "Destructor called" << endl;
    }
};

int main() {
    Shape s;

    return 0;
}

在上述示例代码中,我们试图在Shape类的构造函数中显式调用析构函数。编译器会给出错误提示:析构函数不能显式调用。这是由C++的语言规定实现的。