📜  基于构造函数/析构函数的C++面试问题。

📅  最后修改于: 2021-05-30 02:24:03             🧑  作者: Mango

1.什么是析构函数?
Ans。析构函数是一个成员函数,当对象被删除/销毁或超出范围时被调用。

class String {
private:
    char* s;
    int size;
  
public:
    String(char*); // constructor
    ~String(); // destructor
};

2.在C++中使用析构函数的目的是什么?
Ans。析构函数的主要目的是释放在对象生命周期内分配的所有资源(打开的文件,打开的套接字,数据库连接,资源锁等)。

// CPP program to demonstrate destructors.
class Geeks {
private:
  
    // a private-access pointer to integer
    int* myPrvIntPtr; 
public:
    Geeks()
    {
        // default constructor
        myPrvIntPtr = new int(0);
  
        // allocate a new integer, place its address in myPrvIntPtr
    }
  
    ~Geeks()
    {
        // de-allocate the integer whose address 
        // is stored in myPrvIntPtr
        delete myPrvIntPtr;       
    }
};

3.构造函数的用途是什么?
构造函数是一个与类名称同名的特殊函数。在为您的类创建对象时调用构造函数。构造函数用于在创建对象时初始化对象的实例变量。构造函数还用于为虚拟函数创建虚拟表。

4.如果我不使用复制构造函数怎么办?它在哪里产生问题?
请参阅复制构造函数

5.当我们编写自己的C++编译器时,它会创建默认的构造函数吗?
在C++中,编译器默认情况下为每个类创建默认构造函数。但是,如果我们定义自己的构造函数,则编译器不会创建默认的构造函数。

6. C++中构造函数执行的顺序是什么?
Ans。首先执行基类构造函数,然后执行派生类构造函数,因此执行在继承树中自上而下进行。

7. C++中的析构函数执行顺序是什么?
Ans。通常派生类的析构函数,然后是基类的析构函数。除非我们将派生类对象带入基类指针(或引用变量),否则我们忘记为基类析构函数指定虚拟关键字。有关详细信息,请参见虚拟析构函数。

8.我们可以有虚拟的析构函数吗?如果是这样,虚拟析构函数的用途是什么。
Ans。我们可以。这是为了确保在运行时调用正确的类析构函数。具体来说,当我们使用基类指针或引用来保存派生类对象时。如果我们没有虚拟析构函数,那么它将最终仅调用基类析构函数。

// CPP program without virtual destructor
// causing undefined behavior
#include 
  
using namespace std;
  
class base {
public:
    base()
    {
        cout << "Constructing base \n";
    }
    ~base()
    {
        cout << "Destructing base \n";
    }
};
  
class derived : public base {
public:
    derived()
    {
        cout << "Constructing derived \n";
    }
    ~derived()
    {
        cout << "Destructing derived \n";
    }
};
  
int main(void)
{
    derived* d = new derived();
    base* b = d;
    delete b;
    getchar();
    return 0;
}
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”