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对象在这里被销毁.
}

最新文章

  1. Vuforia点击屏幕自动对焦,过滤UGUI的按钮
  2. Mysql子查询
  3. http://www.cnblogs.com/AloneSword/p/3370462.html
  4. 使用struts的模型驱动注意的问题
  5. ios NSKeyedArchiver 保存对象与对象数组
  6. MYSQL定时创建表分区
  7. 用数据说话,外贸产品选择(中篇)-google趋势分析法
  8. Android Material Design--TextInputLayout
  9. HNOI2018 滚粗记
  10. eolinker——分享项目只需两步
  11. 工厂方法模式(Factory Method)和抽象工厂模式(Abstact Factory)
  12. Shell - 简明Shell入门15 - 调试(Debug)
  13. Oracle查询表占用空间的大小
  14. ImageConverter引起的 invalid address or address of corrupt block 0xb7feab58 passed to dlfree
  15. Golang简单日志类
  16. 吴裕雄 python 爬虫(4)
  17. ftp配置文件
  18. Window系统下用Ant实现Java项目的自动构建和部署
  19. 消息/事件, 同步/异步/协程, 并发/并行 协程与状态机 ——从python asyncio引发的集中学习
  20. Ubuntu解压缩zip,tar,tar.gz,tar.bz2【转】

热门文章

  1. yapi安装 - windows
  2. 给npm换源
  3. Java课程设计---添加学生
  4. Scrapy(五):Response与Request、数据提取、Selector、Pipeline
  5. PHP Curl Accept-Encoding: gzip乱码问题解决
  6. Laravel-自带分页+搜索
  7. [] == ![] 返回 true
  8. 分布式 PostgreSQL 集群(Citus)官方教程 - 迁移现有应用程序
  9. ubuntu 学习中的坑-2021-11-22
  10. 关于dotnet动态生成controller的问题