C++读书笔记:构造函数与析构函数(来自谭浩强的C++程序设计)
2015-07-03 21:35
369 查看
1.构造函数:
构造函数是用来处理对象的初始化。
构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是建立对象时自动执行。
构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。
2.说明:
在类对象进入其作用域时调用构造函数。
构造函数没有返回值。
构造函数不需要用户调用,也不能被用户调用。
在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句,但是不提倡。
如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数。
3.带参数的构造函数
可以采用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现不同的初始化。
(1)带参数的构造函数中的形参,其对应的实参在定义对象时给定。
(2)用这种方法可以方便地实现对不同的对象进行不同的初始化。
4.用参数初始化表对数据成员初始化
除了通过赋值语句对数据成员实现初始化外,C++中还提供了用参数初始化表来实现对数据成员的初始化。
如:Box::Box(int h, w,int len) :height(h),width(w),hength(length){}
即在原来函数首部的末尾加一个冒号,然后列出参数的初始化表。上面中:
用形参h的值初始化数据成员length…
5.构造函数的重载
在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化方法,供用户选用。
这些构造函数具有相同的名字,而参数的个数或参数的类型不同,这称为构造函数的重载。
6.说明:
调用构造函数时不必给出实参的构造函数,成为默认构造函数,或缺省构造函数。
如果在建立对象时选用无参构造函数,正确书写方式:Box box1,而不是:Box box1(),构造函数不能被调用。
尽管在一个类中可以包含多个狗仔函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数。
在构造中使用默认参数是方便而有效的,它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数。
好处:
即使在调用构造函数时没有提供实参值,不仅不会出错,而且还确保按照默认的参数值对对象进行初始化。
应该在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值。
如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参。
一个类只能有一个默认构造函数。若Box(); Box(int =10,int = 10,int =10);则会出错
在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。
析构函数:
析构函数也是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“~”。
当对象的生命周期结束时,会自动执行析构函数:
如果在一个函数中定义了一个对象,当这个对象被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
static局部对象在函数结束时对象并不释放,因此也不掉用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。
如果定义了一个全局对象时,则在程序的流程离开其作用域时,调用该全局对象的析构函数。
如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该函数的析构函数。
析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新的对象使用。
析构函数不能被重载,一个类可以有多个构造函数,但是只能有一个析构函数。
析构函数不仅能够释放资源,它还能够被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”,如输出有关信息。
调用构造函数和析构函数的顺序
在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:
最先被调用的构造函数,其对应的析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。
相当于一个栈。
构造函数是用来处理对象的初始化。
构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是建立对象时自动执行。
构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。
2.说明:
在类对象进入其作用域时调用构造函数。
构造函数没有返回值。
构造函数不需要用户调用,也不能被用户调用。
在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句,但是不提倡。
如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数。
3.带参数的构造函数
可以采用带参数的构造函数,在调用不同对象的构造函数时,从外面将不同的数据传递给构造函数,以实现不同的初始化。
(1)带参数的构造函数中的形参,其对应的实参在定义对象时给定。
(2)用这种方法可以方便地实现对不同的对象进行不同的初始化。
4.用参数初始化表对数据成员初始化
除了通过赋值语句对数据成员实现初始化外,C++中还提供了用参数初始化表来实现对数据成员的初始化。
如:Box::Box(int h, w,int len) :height(h),width(w),hength(length){}
即在原来函数首部的末尾加一个冒号,然后列出参数的初始化表。上面中:
用形参h的值初始化数据成员length…
5.构造函数的重载
在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化方法,供用户选用。
这些构造函数具有相同的名字,而参数的个数或参数的类型不同,这称为构造函数的重载。
6.说明:
调用构造函数时不必给出实参的构造函数,成为默认构造函数,或缺省构造函数。
如果在建立对象时选用无参构造函数,正确书写方式:Box box1,而不是:Box box1(),构造函数不能被调用。
尽管在一个类中可以包含多个狗仔函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数。
在构造中使用默认参数是方便而有效的,它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数。
好处:
即使在调用构造函数时没有提供实参值,不仅不会出错,而且还确保按照默认的参数值对对象进行初始化。
应该在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值。
如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参。
一个类只能有一个默认构造函数。若Box(); Box(int =10,int = 10,int =10);则会出错
在一个类中定义了全部是默认参数的构造函数后,不能再定义重载构造函数。
析构函数:
析构函数也是一个特殊的成员函数,它的作用与构造函数相反,它的名字是类名的前面加一个“~”。
当对象的生命周期结束时,会自动执行析构函数:
如果在一个函数中定义了一个对象,当这个对象被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
static局部对象在函数结束时对象并不释放,因此也不掉用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。
如果定义了一个全局对象时,则在程序的流程离开其作用域时,调用该全局对象的析构函数。
如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该函数的析构函数。
析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新的对象使用。
析构函数不能被重载,一个类可以有多个构造函数,但是只能有一个析构函数。
析构函数不仅能够释放资源,它还能够被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”,如输出有关信息。
调用构造函数和析构函数的顺序
在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:
最先被调用的构造函数,其对应的析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。
相当于一个栈。
相关文章推荐
- 自学笔记-C语言复习2015年7月3日
- 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数
- c++ primer读书笔记-第七章 函数
- C++重载覆盖和隐藏,虚函数与纯虚函数
- C语言qsort C++的sort
- c语言常用函数实现
- 《C++ Primer Plus》学习笔记6
- stl之set集合容器应用基础
- LeetCode-Fraction to Recurring Decimal-解题报告
- 如何从Excel 中调用C/C++写的动态链接库函数
- C++单例模式详解
- C++连接MYSQL数据库(使用MYSQL API方式,环境VS2013+MYSQL5.6)
- C++ NLPIR+FRISO 项目的中文分词功能添加
- LeetCode-Majority Element -解题报告
- C++ primer 学习笔记 2 快速入门2
- 第十七周oj刷题——Problem F: C++习题 输入输出--保护继承
- LeetCode-Excel Sheet Column Number-解题报告
- 第十七周oj刷题——Problem E: C++习题 输入输出--私有继承
- memcpy/memset函数的c语言实现
- 转:给C++初学者的50个忠告