华侨大学C++期末考试题目附答案跪求解析

阅读以下程序并给出执行结果
#include<iostream>
using namespace std;
class A{
public: A(){ cout<<"A-> "; }
~A(){ cout<<"<-~A; "; }
};
class B{
public: B(){ cout<<"B-> "; }
~B(){ cout<<"<-~B; "; }
};
class C{
public: C(){ cout<<"C-> "; }
~C(){ cout<<"<-~C; "; }
};
void func(){
cout<<"\nfunc: ";
A a;
static B b;
C c;
}
int main(){
cout<<"main: ";
for(int i=1; i<=2; ++i){
if(i==2) C c; else A a;
B b; }
func(); func();
return 1;
}
答案:main: A-> <-~A ; B-> <-~B ; C-> <-~C ; B-> <-~B ;
func: A-> B-> C-> <-~C ; <-~A ;
func: A-> C-> <-~C ; <-~A ; <-~B ;
问为什么结果是这样有高手可以详细解析下吗?
为什么说:有一点不同的是第二次运行static B b的时候由于已经有静态变量b的存在,所以第二次的static B b就不再创建实例b,也就没有b的构造函数了。 C和A不也是已经创建过了

LZ,你首先要了解的是什么是构造函数和析构函数。在类A中的A()就是构造函数,表示创建类A的实例时首先运行的函数,~A()是析构函数,表示A的实例到达生命周期被销毁时运行的函数。
现在看main()里的for循环,当i = 1的时候,运行if判断的else A a;
表示创建了一个A的实例,运行A(),输出A->,接着到达if判断语句的结尾,其实要是在else后面加上{}这2个花括号的话可能更直观点。到达结尾也就是表示实例a要被销毁,运行~A(),输出<-~A。接着运行A b,原理同上,接着又到花括号,表示运行周期到,销毁b,输出<-~B。
接着继续进for循环,此时i = 2,运行C c,后面的输出原理就同上面了。就不累赘了。

for循环结束后就运行func(),先A a,创建A的实例,运行A的构造函数,但是没有到func函数的结尾,所以暂时不运行A的析构函数。继续,下面是static B b,表示创建一个静态的实例b。静态成员等同于全局变量,是不会随着函数FUNC的结束而被销毁的。继续-再创建一个实例C。然后到达func的结束符“}”,从之前创建实例的次序反向依次运行析构函数,也就是先析构C,再析构A。由于B是静态变量,不会随着FUNC的结束而销毁,也就不会调用B的析构函数。

接着再运行依次func,原理同上,有一点不同的是第二次运行static B b的时候由于已经有静态变量b的存在,所以第二次的static B b就不再创建实例b,也就没有b的构造函数了。

继续继续,最后main()函数的运行周期到了,静态变量b的运行周期也就到了,要被销毁,运行b的析构函数,也就是最后的时候才输出<-~B

说的很乱,不知道你看明白了没有
主要是你要了解这个几个东西:1 构造函数和析构函数
2 函数运行周期和析构次序
3 还有就是一些成员变量的属性。

最好多看些介绍面向对象的书籍,可能会比较容易理解你这个题目了

饿,写的好累

问题补充:为什么说:有一点不同的是第二次运行static B b的时候由于已经有静态变量b的存在,所以第二次的static B b就不再创建实例b,也就没有b的构造函数了。 C和A不也是已经创建过了

C 和A 是函数func的局部变量,不是全局变量,在func函数运行周期到了以后C和A也就被销毁了,不存在了。所以当下次func函数再次运行的时候又创建了C和A。也就是说,C和A是FUNC的成员变量,运行多少次FUNC就会创建和销毁多少次C和A,而B是静态变量,所以不管有多少次FUNC函数的运行,只会创建和销毁一次B。
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答
大家正在搜