显示调用C++中构造函数和析构函数(有什么弊端)
2021/8/16 20:06:25
本文主要是介绍显示调用C++中构造函数和析构函数(有什么弊端),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、C++中, 构造函数和析构函数可以被显示调用.
显示调用默认构造函数的语法: a.A::A();(不能写成a.A();) , 显示调用非默认构造函数的语法: a.A::A(7);(不能写成a.A(7);); 显示调用析构函数的语法: a.A::~A();(可以写成a.~A();) 。
2、显示调用构造函数和析构函数就像调用一般的函数一样, 并不意味着创建或销毁对象。
3、如果构造函数中动态分配了空间, 则显示调用构造函数会造成内存泄露. 创建对象时的隐式构造函数调用已经为对象分配了动态内存,当用创建好的对象显示调用构造函数时, 对象指向的动态内存更新为显示调用时所分配的, 对象生命周期结束时析构函数所释放掉的是后一次分配的动态内存, 也就是说创建对象时隐式构造函数调用所分配的那块内存泄漏了。
4、如果析构函数中释放动态分配的空间, 则会造成多次释放同一内存, 会出现严重错误。
#include <iostream> using namespace std; class A { public: A() { cout << "Default constructor is called./r/n"; } A(int ix) { cout << "Another constructor is called./r/n"; } ~A() { cout << "Destructor is called./r/n"; } }; int main() { A a1; // <1> a1.A::A(); // <2> 显示调用默认构造函数(写成a1.A()会报错) a1.A::A(7); // <3> 显示调用非默认构造函数(写成a1.A(7)会报错) a1.A::~A(); // <4> 显示调用析构函数, 但是此时对象a1并没有销毁(写成a1.~A()不会报错) // A a2(); // 这样写没报错, 但也没调用任何构造函数和析构函数. A a3 = A(); // <5> 完整写法: A a3 = A::A(); A a4(77); // <6> A a5 = A(777); // <7> 完整写法: A a5 = A::A(777); return 0;// <8>, <9>, <10>, <11> return语句之后, 右括号之前析构函数被隐式调用. a1, a3, a4, a5对象在这里被销毁. }
这篇关于显示调用C++中构造函数和析构函数(有什么弊端)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升