调用构造函数和析构函数的顺序
2016-03-20 08:59
369 查看
构造函数的作用是C++为了解决数据初始化而产生的。因为对对象的初始化,类的数据成员是不能在声明类时初始化的。因为类是抽象的,并不是一个实体,并不占储存空间,显然无法容纳数据,所以便出现了构造函数。
析构函数是一种特殊的成员函数,它的作用与构造函数相反,他的名字是在类名前加上一个“~”符号,在C++中“~”是位取反运算符。特征是:1.在对象的生命周期结束时,会自动执行析构函数。2.析构函数的作用并不是为了删除对象,而是撤销对象占用的内存前完成一些清理任务,是这部分内存可以重新被程序分配给新对象使用。3.析构函数不返回任何值,没有函数类型,也没有函数参数,由于没有函数参数它不能被重载,一个类可以有多个构造函数但只有一个析构函数。
调用析构函数和构造函数的顺序:
先构造的后析构,后构造的先析构,它相当于一个栈先进后出;
下面我们来写一下简单的代码来说明它:
#include<iostream>
using namespace std;
class Test
{
public:
Test(int test):m_test(test){}
~Test(){cout<<"析构函数执行!"<<m_test<<endl;};
void show()
{
cout<<"构造函数执行"<<endl;
cout<<m_test<<endl;
}
private:
int m_test;
};
int main()
{
Test t1(2),t2(5);
t1.show();
t2.show();
return 0;
}
结果是:
由图可以清楚看到顺序;
什么时候调用构造函数和析构函数呢?
(1)在全局范围内定义的对象,他的构造函数在文件中所有函数(包含main函数)执行前调用它,当main函数执行完毕或使用exit提前结束运行前调用析构函数;
(2)如果定义的是局部的自动对象,则在建立对象时调用对象时调用其构造函数。如果函数被多次调用,则在建立对象时,都要调用构造函数,在函数调用结束,对象释放时先调用析构函数。
(3)如果函数中定义的是静态局部变量,则只在程序的第一次调用构造函数一次,在调用对象结束时,对象不释放,因此不能调用析构函数,只在main函数结束时调用析构函数
析构函数是一种特殊的成员函数,它的作用与构造函数相反,他的名字是在类名前加上一个“~”符号,在C++中“~”是位取反运算符。特征是:1.在对象的生命周期结束时,会自动执行析构函数。2.析构函数的作用并不是为了删除对象,而是撤销对象占用的内存前完成一些清理任务,是这部分内存可以重新被程序分配给新对象使用。3.析构函数不返回任何值,没有函数类型,也没有函数参数,由于没有函数参数它不能被重载,一个类可以有多个构造函数但只有一个析构函数。
调用析构函数和构造函数的顺序:
先构造的后析构,后构造的先析构,它相当于一个栈先进后出;
下面我们来写一下简单的代码来说明它:
#include<iostream>
using namespace std;
class Test
{
public:
Test(int test):m_test(test){}
~Test(){cout<<"析构函数执行!"<<m_test<<endl;};
void show()
{
cout<<"构造函数执行"<<endl;
cout<<m_test<<endl;
}
private:
int m_test;
};
int main()
{
Test t1(2),t2(5);
t1.show();
t2.show();
return 0;
}
结果是:
由图可以清楚看到顺序;
什么时候调用构造函数和析构函数呢?
(1)在全局范围内定义的对象,他的构造函数在文件中所有函数(包含main函数)执行前调用它,当main函数执行完毕或使用exit提前结束运行前调用析构函数;
(2)如果定义的是局部的自动对象,则在建立对象时调用对象时调用其构造函数。如果函数被多次调用,则在建立对象时,都要调用构造函数,在函数调用结束,对象释放时先调用析构函数。
(3)如果函数中定义的是静态局部变量,则只在程序的第一次调用构造函数一次,在调用对象结束时,对象不释放,因此不能调用析构函数,只在main函数结束时调用析构函数
相关文章推荐
- FUSE---神奇又迷人的开发工具
- iOS中堆和栈的区别
- public static void main(String[] args) 隐含了什么?
- Dialog使用注意
- android获取应用信息,判断应用来源,监听应用的安装和卸载
- [转载] Eclipse快捷键 10个最有用的快捷键
- PHP函数
- Java 8的新特性—终极版
- Ecstore中如何调用发起Ajax请求
- 在虚拟机中redhat 6进入字符界面的快捷键整理
- 0320 ----推荐系统
- Hbase基本shell运用
- 树上三角形(triangle) 基于LCT上的暴力
- Oracle数据库、实例、用户、表空间、表之间的关系
- Linux内核分析(四)
- FFmpeg教程(二)FFmpeg命令行工具的使用
- Python之反射
- 第39讲项目1——完数(2)
- #碰到的小问题#c++中vector<int> 和vector<int>::iterator有什么不同
- day01 html面试题--表单常用的提交方式有哪些?区别是