目录
构造函数是一个特殊的成员函数,在创建对象的时候,编译器会自动的去调用。
而析构函数也是一个特殊的成员函数,当对象的生命周期结束时,编译器会隐式地去调用。动态对象分配以及释放时,也会调用构造函数与析构函数。
1.被显示调用
能否显式地调用构造函数与析构函数?
答案是当然可以!程序员可以显式地去调用特殊的成员函数。
参考下面例子。
#include <iostream>
using namespace std;
class Test
{
public:
Test() { cout << "Constructor is executed\n"; }
~Test() { cout << "Destructor is executed\n"; }
};
int main()
{
Test(); // pos1, 显式地调用构造函数
Test t; // pos2, 局部对象
t.~Test(); // pos3, 显式地调用析构函数
return 0;
}
运行结果:
Constructor is executed //对应pos1
Destructor is executed //对应pos1
Constructor is executed //对应po2
Destructor is executed //对应pos3
Destructor is executed //自动回收对象t
当显式地调用构造函数时,编译器会创建一个无名的临时对象并且它会被立即析构掉。这就是输出结果中出现第2行的原因。
对于局部对象,即使显式地调用了析构函数,也不能以为这个对象被真正销毁了。
局部对象会在生命周期结束后,被编译器自动回收,这是C++语言所能保证的。
通常情况下,不应该去显式的调用这些特殊成员函数。
2.被成员函数调用
另外,析构函数与析构函数也能被类的成员函数调用。
参考下面例子1。
#include <iostream>
using namespace std;
class Test
{
public:
Test() { cout << "Constructor is executed\n"; }
~Test() { cout << "Destructor is executed\n"; }
void show() { Test(); this->~Test(); }
};
int main()
{
Test t;
t.show();
return 0;
}
运行结果:
Constructor is executed
Constructor is executed
Destructor is executed
Destructor is executed
Destructor is executed
参考下面例子2。
#include <iostream>
using namespace std;
class Test
{
public:
Test() { cout << "Constructor is executed\n"; }
~Test() { cout << "Destructor is executed\n"; }
Test(const Test&) { cout << "Copy constructor is executed\n"; }
friend void fun(Test t);
};
void fun(Test t)
{
Test();
t.~Test();
}
int main()
{
Test();
Test t;
fun(t);
return 0;
}
运行结果:
Constructor is executed //line8
Destructor is executed //line8
Constructor is executed //line9
Copy constructor is executed //line1
Constructor is executed //line3
Destructor is executed //line3
Destructor is executed //line4
Destructor is executed //line5
Destructor is executed //line12