C++题,关于构造函数和析构函数的。求解下面图片这题输出结果怎么得出来的。求详细的调用步骤及次数
展开全部
先解释一个简单的例子:
main()
{
A y = 4;
}
输出结果应该是:4 XxkXxk
y = 4调用的时类A的赋值运算符,而没有调用A的构造函数,所以这里不会输出东西
后面的4,会被默认生成一个A(4)临时对象,结果就相当于A y = A(4);那么刚才输出的4就是这个默认转换所产生的。第一个Xxk是这一句执行完以后,临时对象A(4)被销毁,调用析构函数产生的。第二个Xxk是main函数结束时清除局部变量y,调用的析构函数所产生的。
你上面的例子:A x[3]={1,2,3};会产生三个临时变量,调用三次构造函数,调用三次赋值运算符,调用三次析构函数,输出结果为
1 Xxk2 Xxk3 Xxk
p = new A[3];调用三次构造函数输出:0 0 0,因为构造函数的默认参数是0
delete []p;很简单,调用三次析构函数输出:XxkXxkXxk
main函数结束后删除四个局部变量x[3] y调用四次析构函数输出:XxkXxkXxkXxk
Game Over
更多追问追答
追问
右边那个答案总共就调用了3次,输出了3个Xxk啊
追答
有些编译器会优化一些临时变量,比如A y = 4这个,实际上它是A y = A(4),后面的A(4)是一个临时变量类A,按照正常的语法相当于y.operator=(A(4)),也就是y调用的是类A的赋值运算符,而A(4)被作为一个参数传进去,就是给y分配一段内存空间,然后把临时变量A(4)的值复制过去,再把临时变量A(4)删掉,但是有些编译器会做优化,也就是不给y分配空间,而是直接把临时变量A(4)作为y的内存空间,这样就减少了申请和释放内存的次数,提高了程序的效率,也就不存在删除临时变量A(4)的调用了。你可以运行一下我举的那个简单例子,或者再简单一点
main()
{
A y(4);
}
看看输出结果是什么,正常情况是构造一次,函数结束再析构一次
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询