析构函数被系统自动调用分两种情况。分析以下程序的执行结果。解:本程序执行结果如下:调用带参构造函数矩形s1的面积=153调用无参构造函数矩形s2的面积=0调用了析构函数!......
2023-11-07
和构造函数一样,析构函数也不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用,其顺序与执行构造函数时的顺序正好相反。派生类析构函数执行的一般次序如下:
(1)最先执行派生类的析构函数。
(2)再次调用对象成员(子对象)的析造函数,按类声明中对象成员出现的逆序调用,而不是初始化列表中的次序。
(3)最后调用基类的析构函数,多个基类则按派生类声明时列出的逆序、从右到左调用,而不是初始化列表中的次序。
【例6.8】分析以下程序的执行结果。
解:上述程序中,由基类A公有派生类B(属单继承的情况),所以对于语句“B b”定义的对象b,先执行基类A的构造函数,再执行类B的构造函数。在释放对象b时,先执行类B的析构函数,再执行类A的析构函数。程序的执行结果如下:
A Constructor
B Constructor
B Destructor
A Destructor(www.chuimin.cn)
若基类和派生类都包含其他类的对象,在创建派生类的对象时,析构函数是按照对应的构造函数调用的相反顺序来调用的。首先执行派生类的析构函数,然后执行派生类成员对象的析构函数,再执行基类的析构函数,最后执行基类成员对象的析构函数。
【例6.9】分析以下程序的执行结果。
解:上述程序中,由类C派生出类D(属单继承的情况),但类C中包含一个类A的对象a,类D中包含一个类B的对象b,对应的类层次如图6.9所示。所以,对于main()函数中的语句D d,先执行类D中的析构函数,再执行类D中对象的析构函数,接着是基类C的析构函数,最后执行类C中对象的析构函数。程序执行结果如下:
classs D
classs B
classs C
classs A
图6.9 类层次图
有关C++程序设计基础教程的文章
析构函数被系统自动调用分两种情况。分析以下程序的执行结果。解:本程序执行结果如下:调用带参构造函数矩形s1的面积=153调用无参构造函数矩形s2的面积=0调用了析构函数!......
2023-11-07
同样,当含有子对象的类存在析构函数时,特别要注意析构函数的调用次序。析构函数的调用执行顺序与构造函数刚好相反。分析以下程序的执行结果。解:上述程序中声明了4个类,类A中含有3个子对象b1、b2、b3,分别是类B1、B2、B3的对象,其声明次序是b1、b2、b3,按照子对象构造函数和析构函数的执行次序得到以下程序执行结果:B1:ConstructorB2:ConstructorB3:ConstructorA:ConstructorA:DestructorB3:DestructorB2:DestructorB1:Destructor分析以下程序的执行结果。调用在A类中第二个定义的对象成员two的构造函数。......
2023-11-07
所以,在定义派生类的构造函数时除了对自己的数据成员进行初始化外,还必须负责调用基类构造函数使基类的数据成员得以初始化。如果派生类中还有子对象,还应包含对子对象初始化的构造函数。最后执行派生类的构造函数。其中,如果派生类新增成员中有某个类的子对象,第步的调用才会执行,否则就直接跳转到第步,执行派生类的构造函数。在某些情况下,派生类构造函数的函数体可能为空,仅起到参数传递作用。......
2023-11-07
解:上述程序中,在执行main()中的fun();语句时调用fun()函数,该函数要首先构造对象in1,调用Ins类的构造函数Ins(),并将in1入栈,然后构造对象in2,调用Ins类的构造函数Ins,并将in2入栈,最后执行throw Ex();语句抛掷Ex类异常,在检测到catch时,展开该栈,先是对象in1出栈,执行Ins类的析构函数,再是对象in2出栈,又一次执行Ins类的析构函数。......
2023-11-07
声明函数模板的一般格式如下:template<模板参数表>函数返回值类型函数模板名(形参表)函数模板定义由关键字template开头,表示声明一个模板。模板参数表写在尖括号<>中,参数一般由关键字class或typename后加一个标识符构成。Class和typename的意义相同,表示后面的标识符是一个参数类型,代表一个潜在的标准类型或用户定义的类型。例如,定义max函数模板求两个数中的较大者。如下面的声明是错误的:可以看出,用函数模板比函数重载更方便,程序更简洁。......
2023-11-07
函数模板是不能直接执行的,需要实例化为模板函数后才能执行。模板函数的生成就是将函数模板的类型形参实例化的过程。当执行min时,便创建了该函数模板的一个实例,这个过程被称为函数模板实例化。图5.2函数模板的实例化在模板函数被实例化之前,必须在程序的某个地方首先声明它,这样,就可以到后面再实例化为模板函数。......
2023-11-07
内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的。即使虚函数在类的内部定义,编译时仍将其看作是非内联的。声明虚析构函数的目的在于:使用delete运算符删除一个对象时,能确保析构函数被正确地执行。如果不相同,则被派生类虚函数的参数类型强制转换为基类中虚函数的参数类型。......
2023-11-07
相关推荐