您的位置:首页 > 编程语言 > C语言/C++

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运算符释放该对象时,先调用该函数的析构函数。

析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新的对象使用。

析构函数不能被重载,一个类可以有多个构造函数,但是只能有一个析构函数。

析构函数不仅能够释放资源,它还能够被用来执行“用户希望在最后一次使用对象之后所执行的任何操作”,如输出有关信息。

调用构造函数和析构函数的顺序

在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:

最先被调用的构造函数,其对应的析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。

相当于一个栈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: