析构函数与构造函数的区别联系
来源:互联网 发布:js dom遍历 编辑:程序博客网 时间:2024/04/30 14:46
在备战C++的学习当中,由于很多都用到函数,再次要求自己加深对函数的理解,C++中知识是并不多,我们只有不断的理解函数的真正用法,下面学习才会顺水推舟!加油!
析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
C++语言析构函数格式
C++当中的析构函数格式如下: class <类名> { public: ~<类名>(); }; <类名>::~<类名>() { //函数体 } 如以下定义是合法的: class T { public: ~T() }; T::~T() { //函数体 }当程序中没有析构函数时,系统会自动生成以下析构函数: <类名>::~<类名>(){},即不执行任何操作。
下面通过一个例子来说明一下析构函数的作用:
#include<iostream> using namespace std; class T { public: ~T(){cout<<"析构函数被调用。";} //为了简洁,函数体可以直接写在定义的后面。 }; int main() { T *t=new T;//建立一个T类的指针对象t delete t; cin.get(); } 最后输出:
构造函数 是一种特殊的方法 主要用来在创建对象时初始化对象 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载
C++的构造函数定义格式为:
class <类名> { public: <类名>(参数表) //...(还可以声明其它成员函数) }; <类名>::<函数名>(参数表) { //函数体 } 如以下定义是合法的: class T { public: T(int a=0){i=a;}//构造函数允许直接写在类定义内,也允许有参数表。 private:int i; };
如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提供默认的构造函数:
1、如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;
2、如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认构造函数);
3、在类中的所有非静态的对象数据成员,它们对应的类中有构造函数(可以是用户定义的构造函数,或 编译器提供的默认构造函数)。
<类名>::<类名>(){},即不执行任何操作。
C++构造函数例子
//注意若将本代码直接复制进编译器,可能会报错,原因是网页生成时会在代码前加一个中文占位符
//最好将代码再写一次
#include <iostream> using namespace std; class time { public: time() //constructor.构造函数 { hour=0; minute=0; sec=0; } void set_time(); void show_time(); private: int hour; int minute; int sec; }; int main() { class time t1; t1.show_time(); t1.set_time(); t1.show_time(); return 0; } void time::set_time() { cin >>hour; cin >>minute; cin >>sec; } void time::show_time() { cout<<hour<<":"<<minute<<":"<<sec<<endl; } 程序运行情况: 0:0:0 10 11 11 回车 10:11:11
任何时候,只要创建类或结构,就会调用它的构造函数。类或结构可能有多个接受不同参数的构造函数。构造函数使得程序员可设置默认值、限制实例化以及编写灵活且便于阅读的代码。
构造函数与析构函数的区别
构造函数有以下特点:
1.构造函数的名字必须与类名相同;
2.构造函数可以有任意类型的参数,但不能具有返回类型;
3.定义对象时,编译系统会自动地调用构造函数;
4.构造函数是特殊的成员函数,函数体可以在类体内,也可写在类体外;
5.构造函数被声明为公有函数,但它不能像其他成员函数那样被显式调用,它是在定义对象的同时被调用的。
析构函数有以下特点:
1.析构函数的名字必须与类名相同,但它前面必须加一个波浪号 ~ ;
2.析构函数没有参数,也没有返回值,而且不能被重载,因此在一个类中只能有一个析构函数;
3.当撤销对象时,编译系统会自动地调用析构函数。
- 析构函数与构造函数的区别联系
- 构造函数和get/set方法的区别与联系
- 赋值运算符与拷贝构造函数的区别与联系(转)
- 赋值运算符和拷贝构造函数的区别与联系
- 简单函数与构造函数的区别?
- 构造函数与一般函数的区别
- 构造函数与成员函数的区别?
- 构造函数与普通函数的区别
- 构造函数与普通函数的区别
- 构造函数与普通函数的区别
- 构造函数与普通 函数的区别
- 构造函数与一般函数的区别
- 构造函数与普通函数的区别
- 函数与映射的区别和联系
- 构造函数、析构函数为虚函数的区别
- fork函数与vfork函数的区别与联系详解
- srting的类构造函数、析构函数、拷贝构造函数与赋值构造函数
- 拷贝构造函数与赋值构造函数的区别
- window manager 参数
- AMD公司的灵魂Athlon产品回忆录
- 数理逻辑:谓词演算(20)在谓词演算中表达的公理系统
- 倫敦游五日遊
- JAVA大数处理
- 析构函数与构造函数的区别联系
- android 内置常用 apk 中英文对照表
- 消息转发 forwardInvocation
- 跨界无罪,四核有理,三星发布四核Android相机Galaxy Camera
- Git本地仓库内部基本结构
- 怎么在jquery中调用代理
- ffmpeg在windows下的编译
- HttpServletResponse.sendRedirect()方法/RequestDispatcher.forward()方法
- 二维线段树 POJ 2155 Matrix