本文共 1868 字,大约阅读时间需要 6 分钟。
目录
构造函数是一个特殊的成员函数,在创建对象的时候,编译器会自动的去调用。
而析构函数也是一个特殊的成员函数,当对象的生命周期结束时,编译器会隐式地去调用。动态对象分配以及释放时,也会调用构造函数与析构函数。能否显式地调用构造函数与析构函数?
答案是当然可以!程序员可以显式地去调用特殊的成员函数。 参考下面例子。#includeusing 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++语言所能保证的。
通常情况下,不应该去显式的调用这些特殊成员函数。另外,析构函数与析构函数也能被类的成员函数调用。
参考下面例子1。#includeusing 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。
#includeusing 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
转载地址:http://zheji.baihongyu.com/