题目:分析一下这段程序的输出。帮忙解释一下为什么
//133.分析一下这段程序的输出(C++)#include<iostream>usingnamespacestd;classB{public:B(){cout<<"de...
//133.分析一下这段程序的输出 (C++)
#include <iostream>
using namespace std;
class B
{
public:
B()
{
cout << "default constructor" << endl;
}
~B()
{
cout << "destructed" << endl;
}
B(int i) : data(i)
{
cout<< "constructed by parameter" << data <<endl;
}
private:
int data;
};
B Play( B b)
{
return b ;
}
int main(int argc, char* argv[])
{
B temp = Play(5);
return 0;
}
标准答案是:
constructed by parameter
destructed(释放临时变量)
destructed 展开
#include <iostream>
using namespace std;
class B
{
public:
B()
{
cout << "default constructor" << endl;
}
~B()
{
cout << "destructed" << endl;
}
B(int i) : data(i)
{
cout<< "constructed by parameter" << data <<endl;
}
private:
int data;
};
B Play( B b)
{
return b ;
}
int main(int argc, char* argv[])
{
B temp = Play(5);
return 0;
}
标准答案是:
constructed by parameter
destructed(释放临时变量)
destructed 展开
1个回答
展开全部
Play(5); 这是个临时无名对象
调用 的是:
B(int i) : data(i)
{
cout<< "constructed by parameter" << data <<endl;
}
然后调用默认operator=(没有,编译器自动生成一个),将临时无名对象拷贝到temp,拷贝完,要析构。所以其实构造了两个对象,函数结束要析构temp,所以调用两次析构函数。
调用 的是:
B(int i) : data(i)
{
cout<< "constructed by parameter" << data <<endl;
}
然后调用默认operator=(没有,编译器自动生成一个),将临时无名对象拷贝到temp,拷贝完,要析构。所以其实构造了两个对象,函数结束要析构temp,所以调用两次析构函数。
追问
既然是两个对象,那为什么temp不需要调用构造函数呢?还可以不调用构造函数就析构吗
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询