博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++构造与析构(19) - 显式地调用构造函数和析构函数
阅读量:4071 次
发布时间:2019-05-25

本文共 1868 字,大约阅读时间需要 6 分钟。

目录


构造函数是一个特殊的成员函数,在创建对象的时候,编译器会自动的去调用。

而析构函数也是一个特殊的成员函数,当对象的生命周期结束时,编译器会隐式地去调用。动态对象分配以及释放时,也会调用构造函数与析构函数。

1.被显示调用

能否显式地调用构造函数与析构函数?

答案是当然可以!程序员可以显式地去调用特殊的成员函数。
参考下面例子。

#include 
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 
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 
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

 

转载地址:http://zheji.baihongyu.com/

你可能感兴趣的文章
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>
Node.js中的事件驱动编程详解
查看>>
mongodb 命令
查看>>
MongoDB基本使用
查看>>
mongodb管理与安全认证
查看>>
nodejs内存控制
查看>>
nodejs Stream使用中的陷阱
查看>>
MongoDB 数据文件备份与恢复
查看>>
数据库索引介绍及使用
查看>>
MongoDB数据库插入、更新和删除操作详解
查看>>
MongoDB文档(Document)全局唯一ID的设计思路
查看>>
mongoDB简介
查看>>
Redis持久化存储(AOF与RDB两种模式)
查看>>
memcached工作原理与优化建议
查看>>
Redis与Memcached的区别
查看>>
redis sharding方案
查看>>