析构函数被系统自动调用分两种情况。分析以下程序的执行结果。解:本程序执行结果如下:调用带参构造函数矩形s1的面积=153调用无参构造函数矩形s2的面积=0调用了析构函数!......
2023-11-07
同样,当含有子对象的类存在析构函数时,特别要注意析构函数的调用次序。析构函数的调用执行顺序与构造函数刚好相反。在含有子对象的类A中,设计析构函数如下:
~A(){函数体;}
其执行次序是:先执行函数体,再以子对象在类A中说明的相反次序调用各类的析构函数。
【例2.24】分析以下程序的执行结果。
解:上述程序中声明了4个类,类A中含有3个子对象b1、b2、b3,分别是类B1、B2、B3的对象,其声明次序是b1、b2、b3,按照子对象构造函数和析构函数的执行次序得到以下程序执行结果:
B1:Constructor
B2:Constructor
B3:Constructor
A:Constructor
A:Destructor
B3:Destructor
B2:Destructor
B1:Destructor
【例2.25】分析以下程序的执行结果。
解:程序的执行结果如下:
4,调用B的构造函数!(www.chuimin.cn)
3,调用B的构造函数!
1,调用A的构造函数!
1,调用A的析构函数!
3,调用B的析构函数!
4,调用B的析构函数!
因为建立类的对象时,先调用各个对象成员的构造函数(调用顺序取决于对象成员在类中的声明顺序),然后才执行类的构造函数。所以本例中建立类A的对象obj时,首先调用对象成员one的构造函数B(int i),然后调用对象成员two的构造函数B(int i),最后调用类A的构造函数A()。析构函数的调用顺序与构造函数正好相反。
用类A定义对象obj时,调用构造函数与析构函数的步骤如下:
(1)调用在A类中第一个定义的对象成员one的构造函数:
实参数字4通过形参k传送给one(k),再经实参k传送给形参i赋给b,调用B(i)构造函数时,输出:4,调用B的构造函数!
(2)调用在A类中第二个定义的对象成员two的构造函数。实参1→i,2→j,调用B(i+j)构造函数,输出:3,调用B的构造函数!
(3)调用A(int i,int j,int k)构造函数,实参1→i→a,输出:1,调用A的构造函数!
(4)当main()执行结束后,先执行A的析构函数,输出:1,调用A的析构函数!
(5)再执行B的析构函数,输出:3,调用B的析构函数!
(6)再执行B的析构函数,输出:4,调用B的析构函数!
有关C++程序设计基础教程的文章
析构函数被系统自动调用分两种情况。分析以下程序的执行结果。解:本程序执行结果如下:调用带参构造函数矩形s1的面积=153调用无参构造函数矩形s2的面积=0调用了析构函数!......
2023-11-07
和构造函数一样,析构函数也不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用,其顺序与执行构造函数时的顺序正好相反。最后调用基类的析构函数,多个基类则按派生类声明时列出的逆序、从右到左调用,而不是初始化列表中的次序。首先执行派生类的析构函数,然后执行派生类成员对象的析构函数,再执行基类的析构函数,最后执行基类成员对象的析构函数。......
2023-11-07
声明函数模板的一般格式如下:template<模板参数表>函数返回值类型函数模板名(形参表)函数模板定义由关键字template开头,表示声明一个模板。模板参数表写在尖括号<>中,参数一般由关键字class或typename后加一个标识符构成。Class和typename的意义相同,表示后面的标识符是一个参数类型,代表一个潜在的标准类型或用户定义的类型。例如,定义max函数模板求两个数中的较大者。如下面的声明是错误的:可以看出,用函数模板比函数重载更方便,程序更简洁。......
2023-11-07
声明虚函数的一般格式如下:virtual函数类型函数名(参数表)其中,用关键词virtual声明的函数称为虚函数。如果一个成员函数被声明为虚函数,这就意味着该成员函数在派生类中可能有不同的实现。动态绑定只能通过指针或引用标识对象来调用虚函数。......
2023-11-07
静态成员函数与静态数据成员类似,也是属于类的。与一般成员函数类似,静态成员函数也有访问限制,私有静态成员函数不能由外界访问。解:本程序的执行结果如下:s=5程序中定义对象a时,通过构造函数使静态数据成员n=2,在定义对象b时,通过构造函数使静态数据成员n=5,再执行MyClass2∷add()语句使全局变量s=5。这样共执行构造函数5次,n累计为5。......
2023-11-07
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2023-11-07
为此,C++提供了一个更好的方法,就是利用类的构造函数来初始化类的数据成员。构造函数具有如下几个特点:构造函数名与类名相同,且没有返回值,不能指定函数类型。构造函数通常被声明为公有属性,但它不能像其他成员函数那样被显式地调用,它是在创建对象时被系统自动调用的。例如,可以将例2.1的MyClass类扩展为MyClass2,使其包含两个构造函数:上述类中包含两个构造函数:一个没有参数,另一个有两个参数。......
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
相关推荐