求解一道C++程序阅读题

来源:百度知道 编辑:UC知道 时间:2024/05/29 18:18:28
阅读程序,并写出程序输出结果。
#include <iostream>
using namespace std;

class DA{
int k;
public:
DA(int x=1):k(x){}
~DA(){cout<<k;}
};

int main()
{
DA d[]={DA(3),DA(3),DA(3)};
DA *p=new DA[2];
delete []p;
return 0;
}
小弟赶着考试,麻烦c++高手多多帮忙

楼上的答案都是有问题的。
正确的答案是11333.下面开始解释原因:
1.先解释DA类
它有个数据成员K(整形),还有个构造函数(就是在创建类实例的时候编译器自动调用的),这个构造函数有个形参X并有个默认值1,这是什么意思呢?就是说如果你在实例化对象的时候没有给对象参数时,这时候X就等于1了,如DA A;这时候创建了一个A对象,但是没给参数,就说明这时候X=1;又如 DA A(3),这时候创建了一个A对象,并把3赋值给X;而我们注意到DA(INT X=1)后面有个冒号,这里的作用是给成员变量K赋值的,就是把X的值给K。
2 析构函数
首先要明白析构函数是在什么地方调用的,它是在一个对象生命周期完成时,编译器自动调用的,什么是生命周期呢,在这里你只要看对象在那个大括号内,走出这个大括号对象的生命周期就结束了,就要调用析构函数来释放内存。但是这种情况是对一般声明的变量而言的,如 INT X,DA D[]={DA(3),DA(3),DA(3)}都是这种情况。两外一种情况就是用NEW 关键字来分配内存,这时候是在堆内存上分配的,这种变量的生命是一直存在的,除非用DELETE 来释放内存,这时它才会调用析构函数,如 DA *p=new DA[2]; delete []p; 就是这种情况。
3 结果解释
首先定义了一个DA 数组d它有三个对象,注意都是DA(3)来初始化对象的,这时候X=3,(而不是默认的1,楼上的哥们就是犯了这个错误),当然这时候K=3啦。在来注意它是一个普通的定义,它是有生命周期的,就是在大括号内。再来就是DA *p=new DA[2]; ,这是什么意思呢:就是定义了一个DA对象的指针P,然后在对内存上分配一个空间并把首地址赋值给P,注意它是没有生命周期的,而NEW DA[2]就是创建了2个对象,这是用的是默认值1,那K=1啦,在调用DELETE[]P时,就会释放空间,然后显示K的值,这就是结果前面两个1出来的根据。当程序结束时,那就是D生命周期到的时候,也会调用析构函数,显示K的值,也就是3了,所以后面就跟了三个3,这就是这个程序的解释,有什么不明白在问。

11111
这是我在vc上运行的结果,其实输出的并不是十一而是1和1. 一个一个的输出的。