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

阅读以下程序并给出执行结果#include<iostream>usingnamespacestd;classA{public:A(){cout<<"A->";}~A(){... 阅读以下程序并给出执行结果
#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不也是已经创建过了
展开
 我来答
morebread
2010-08-31 · 超过41用户采纳过TA的回答
知道小有建树答主
回答量:117
采纳率:0%
帮助的人:132万
展开全部
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。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式