c++析构函数是虚函数应用?

析构函数主要作用释放资源避免内存泄漏
类里面只用基本类型int
double等系统默认析构函数其实都没有做
使用了其类vectorstring等系统默认析构函数会调用些类对象析构函数
自己写析构函数类里面分配了系统资源new了内存空间打开了文件等析构函数必须释放相应内存空间和关闭相关文件;样系统会自动调用析构函数释放资源避免内存泄漏

你对这个回答的评价是?

}

1.1 构造函数具有一些特殊的性质

1.2 定义构造函数的一般形式

1.3 利用构造函数创建对象

3、缺省参数的构造函数

5.1 自定义拷贝构造函数

5.2 缺省的拷贝构造函数

5.3 调用拷贝构造函数的三种情况

5.4 浅拷贝和深拷贝

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

创一个小群,供大家学习交流聊天

如果有对学C++方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀。

也希望大家对学C++能够持之以恒

如果你想要学好C++最好加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织:

构造函数和析构函数都是类的成员函数,但它们都是特殊的成员函数,执行特殊的功能,不用调用便自动执行,而且这些函数的名字与类的名字有关。

C++语言中有一些成员函数性质是特殊的,这些成员函数负责对象的建立、删除。这些函数的特殊性在于可以由编译器自动地隐含调用,其中一些函数调用格式采用运算符函数重载的语法。

C++引进一个自动完成对象初始化过程的机制,这就是类的构造函数。

1、数据成员是不能在声明类时初始化

2、类型对象的初始化方法:

1) 调用对外接口(public成员函数)实现:声明类→定义对象→调用接口给成员赋值

2) 应用构造函数(constructor) 实现:声明类→定义对象→同时给成员赋值

构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。

1.1 构造函数具有一些特殊的性质:

(1) 构造函数的名字必须与类名相同。

(2) 构造函数可以有任意类型的参数,但不能指定返回类型。 它有隐含的返回值,该值由系统内部使用。

(3) 构造函数是特殊的成员函数,函数体可写在类体内,也可写在类体外。

(4) 构造函数可以重载,即一个类中可以定义多个参数个数或参数类型不同的构造函数。构造函数是不能继承

(5) 构造函数被声明为公有函数,但它不能像其他成员函数那样被显式地调用,它是在定义对象的同时被调用的。

(6) 在声明类时如果没有定义类的构造函数,编译系统就会在编译时自动生成一个默认形式的构造函数,

(7) 默认构造函数是构造对象时不提供参数的构造函数。

(8) 除了无参数构造函数是默认构造函数外,带有全部默认参数值的构造函数也是默认构造函数。

(9) 自动调用:构造函数在定义类对象时自动调用, 不需用户调用,也不能被用户调用。在对象使用前调用。

(10) 调用顺序:在对象进入其作用域时(对象使用前) 调用构造函数。

1.2 定义构造函数的一般形式

类名(形参表) ;//构造函数的原型

类名::类名(形参表)//构造函数的实现

1.3 利用构造函数创建对象

(1) 利用构造函数直接创建对象.其一般形式为:类名 对象名[(实参表)];

这里的“类名”与构造函数名相同,“实参表”是为构造函数提供的实际参数。

例2.7 为类Date建立一个构造函数

例2.8 利用构造函数直接创建对象

(2) 利用构造函数创建对象时,通过指针和new来实现。其一般语法形式为:

构造函数的名字必须与类名相同,否则编译器将把它当作一般的成员函数来处理。

构造函数是不能说明它的返回值类型的,甚至说明为void类型也不行。

构造函数可以是不带参数的。

有两个长方柱,其长、宽、高分别为:(1)12,25,30;(2)15,30,21。求它们的体积。要求:编一个基于对象的程序,在类中用带参数的构造函数。

对于常量类型和引用类型的数据成员,不能在构造函数中用赋值语句直接赋值,C++提供初始化表进行置初值。

带有成员初始化表的构造函数的一般形式如下:

类名::构造函数名([参数表])[:(成员初始化表)]

成员初始化表的一般形式为:

数据成员名1(初始值1),数据成员名2(初始值2),……

例2.9 成员初始化表的使用

构造函数采用成员初始化表对数据成员进行初始化,是一些程序员喜欢使用的方法。

如果需要将数据成员存放在堆中或数组中,则应在构造函数中使用赋值语句,即使构造函数有成员初始化表也应如此。

类成员是按照它们在类里被声明的顺序初始化的,与它们在初始化表中列出的顺序无关。

3、缺省参数的构造函数

在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化的方法,供用户选用。这些构造函数具有相同的名字,而参数的个数或参数的类

型不相同(这称为构造函数的重载)

关于构造函数重载的说明

(1) 默认构造函数:一个调用构造函数时不必给出实参的构造函数。 显然,无参的构造函数属于默认构造函数。一个类只能有一个默认构造函数。

(2) 尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。

例2.17 重载构造函数应用例程。

// 调用无参数的构造函数

// 调用带参数的构造函数

例2.18 关于计时器的例子

拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用。其作用是使用一个已经存在的对象去初始化另一个同类的对象。

通过等于号复制对象时,系统会自动调用拷贝构造函数。

拷贝构造函数与原来的构造函数实现了函数的重载。

拷贝构造函数具有以下特点:

(1) 因为该函数也是一种构造函数,所以其函数名与类名相同,并且该函数也没有返回值类型。

(2) 该函数只有一个参数,并且是同类对象的引用。

(3) 每个类都必须有一个拷贝构造函数。程序员可以根据需要定义特定的拷贝构造函数,以实现同类对象之间数据成员的传递。如果程序员没有定义类的拷贝构造函数,系统就会自动生成产生一个缺省的拷贝构造函数。

5.1 自定义拷贝构造函数

自定义拷贝构造函数的一般形式如下:

类名(形参);//构造函数

类名(类名 &对象名);//拷贝构造函数

用户自定义拷贝构造函数

如果p1、 p2为类Coord的两个对象,p1已经存在,则coord p2(p1)调用拷贝构造函数来初始化p2

例2.19 自定义拷贝构造函数的使用

除了用代入法调用拷贝构造函数外,还可以采用赋值法调用拷贝构造函数,如:

用对象p1初始化对象p2

5.2 缺省的拷贝构造函数

如果没有编写自定义的拷贝构造函数,C++会自动地将一个已存在的对象复制给新对象,这种按成员逐一复制的过程由是缺省拷贝构造函数自动完成的。

例2.20 调用缺省的拷贝构造函数

// 调用了普通构造函数初始化对象p1

5.3 调用拷贝构造函数的三种情况

(1) 当用类的一个对象去初始化该类的另一个对象时。

(2) 当函数的形参是类的对象,调用函数,进行形参和实参结合时。

(3) 当函数的返回值是对象,函数执行完成,返回调用者时。

5.4 浅拷贝和深拷贝

所谓浅拷贝,就是由缺省的拷贝构造函数所实现的数据成员逐一赋值,若类中含有指针类型数据, 则会产生错误。

为了解决浅拷贝出现的错误,必须显示地定义一个自己的拷贝构造函数,使之不但拷贝数据成员,而且为对象1和对象2分配各自的内存空间,这就是所谓的深拷贝。

例2.23 浅拷贝例子

例2.24 深拷贝例子

析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于撤消对象时的一些清理任务,如释放分配给对象的内存空间等。

析构函数有以下一些特点:

① 析构函数与构造函数名字相同,但它前面必须加一个波浪号(~);

② 析构函数没有参数,也没有返回值,而且不能重载。因此在一个类中只能有一个析构函数;

③ 当撤消对象时,编译系统会自动地调用析构函数。 如果程序员没有定义析构函数,系统将自动生成和调用一个默认析构函数,默认析构函数只能释放对象的数据成员所占用的空间,但不包括堆内存空间。

析构函数被调用的两种情况

1) 若一个对象被定义在一个函数体内,当这个函数结束时,析构函数被自动调用。

2) 若一个对象是使用new运算符动态创建,在使用delete释放时,自动调用析构函数。

【例2.13】 较完整的学生类例子

每个类必须有一个析构函数。

若没有显式地为一个类定义析构函数,编译系统会自动地生成一个缺省的析构函数

其格式如下:类名::析构函数名( ){ }

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

调用析构函数的次序正好与调用构造函数的次序相反:最先被调用的构造函数,其对应的(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。

在全局范围中定义的对象(即在所有函数之外定义的对象),它的构造函数在所有函数(包括main函数)执行之前调用。在程序的流程离开其作用域时(如main函数结束或调用exit函数)时,调用该全局对象的析构函数。

局部自动对象(例如在函数中定义的对象),则在建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束、对象释放时先调用析构函数。

如果在函数中定义静态局部对象,则只在程序第一次调用此函数建立对象时调用构造函数一次,在调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。

对象按生存期的不同分为如下几种:

当对象被定义时,调用构造函数,该对象被创建;当程序退出该对象所在的函数体或程序块时,调用析构函数,对象被释放。

局部对象是被定义在一个函数体或程序块内的,它的作用域限定在函数体或程序块内,生存期较短。

当程序开始运行时,调用构造函数,该对象被创建;当程序结束时,调用析构函数,该对象被释放。

静态对象是被定义在一个文件中,它的作用域从定义是起到文件结束时为止。生存期较长。

当程序中定义静态对象时,调用构造函数,该对象被创建;当整个程序结束时,调用析构函数,对象被释放。

全局对象是被定义在某个文件中,它的作用域包含在该文件的整个程序中,生存期是最长的。

执行new运算符调用构造函数,动态对象被创建;用delete释放对象时,调用析构函数。

动态对象是由程序员掌握的,它的作用域和生存期是由new和delete之间的间隔决定的。

一圆形游泳池如图所示,现在需在其周围建一圆形过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。

/*函数后的修饰符const表示该成员函数的执行不会改变类的状态,也就是说不会修改类的数据成员。 */

//计算栅栏造价并输出

//计算过道造价并输出

  • 参考链接 一、构造函数 C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。 若没有提供任何构造函...

  • 构造函数 一.构造函数的作用: 构造函数主要用于来对类的对象生成标识符,对数据成员进行初始化,和分配内存空间。 相...

  • 构造函数 每个类分别定义了对象被初始化的方式,类通过一个或几个特殊的成员函数来控制对象的初始化过程,这些函数叫做构...

  • 转:C++继承中构造函数、析构函数调用顺序及虚析构函数 1.构造函数 大家都知道构造函数里就可以调用成员变量,而继...

  • 心灵自由写作11篇 “大学生祼贷”,说实在的,刚看到这个主题,心里一点概念都没有,虽然在新闻上也看到这方面的报道,...

  • 黄黄的杨树叶落在我的脚边 告诉我秋天来了 我向你发出微信祝福你早上安好 清晨慢慢起雾了 像巫神在施展法术 我想着你...

  • 三月三十一日是阴历二月十五,当我缓步轻声走往洞山禅堂途中,突然被天上的月光迷住了。天边挂着金黄色的“蓝月亮”。 原...

  • 沉迷老电影的寂寥小演员几经打击,一次无意走进酒吧的她认识了在舞台上偏执谈自己喜欢的爵士乐的钢琴师。两个不被他人左右...

  • 不尚贤,使民不争;不贵难得之货,使民不为盗;不见可欲,使民心不乱。是以圣人之治,虚其心,实其腹;弱其志,强其骨。常...

}

我要回帖

更多关于 析构函数是虚函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信