一个简单的C++程序,帮帮小弟看下为什么这个输出会有两个析构函数但是却只有一个构造函数?

#include<iostream>usingnamespacestd;classB{public:B(){x=0;cout<<"调用默认构造函数!"<<endl;}B(... #include <iostream>
using namespace std;
class B
{
public:
B(){x=0;cout<<"调用默认构造函数!"<<endl;}
B(int i){x=i;cout<<"调用带一个参数的构造函数!"<<x<<endl;}
~B(){cout<<"调用默认析构函数!"<<endl;}
void set(int i){x=i;}
int get()const{return x;}
private:
int x;
};
void main()
{
B b;
cout<<"x="<<b.get()<<endl;
B c(b);
cout<<"x="<<c.get()<<endl;
}
输出的结果是:
展开
 我来答
帐号已注销
推荐于2016-03-01 · TA获得超过426个赞
知道答主
回答量:57
采纳率:0%
帮助的人:67.8万
展开全部

因为你定义的c是用b初始化的,但你在类中又没有自定义使用类B为参数的构造函数,程序调用默认构造函数对c进行初始化,当然你的程序不会显示出c的构造过程。

改成如下程序就能看出来了:

class B
{
public:
B(){x=0;cout<<"调用默认构造函数!"<<endl;}
B(int i){x=i;cout<<"调用带一个参数的构造函数!"<<x<<endl;}
B(const B &c) {x=c.x; cout << "调用自定义的拷贝构造函数" << endl;}   //增加这一行
~B(){cout<<"调用默认析构函数!"<<endl;}
void set(int i){x=i;}
int get()const{return x;}
private:
int x;
};

输出如下:

调用默认构造函数!

x=0

调用自定义的拷贝构造函数

x=0

调用默认析构函数!

调用默认析构函数!

请按任意键继续. . .


不懂请追问,望采纳

追问
您好,谢谢您耐心的回答。我还有个问题不知道能不能再请教您下:
假如我在类里添加了运算符重载的代码:
B operator++()
{ ++x;
return B(x);

}

然后main函数改为:
void main()
{ B b;
B c=++b;

}
关键在第二句,为什么到第二句输出时只输出了一个++b的构造函数?为什么没有B c的构造函数呢
追答

因为++的重载函数返回的是B类型的值,语句B c=++b; 直接将++b返回的B类的值给了c。

你用

int main()
{
B b;
B c ;
c = ++b;
B d = ++b;
cout << "下面程序结束\n";
return 0;
}

运行即可看出++操作中使用的构造函数产生的B类的值到程序退出main才析构。

marsding2006
2013-08-30 · TA获得超过4627个赞
知道大有可为答主
回答量:3090
采纳率:40%
帮助的人:1249万
展开全部
因为B c(b)调用的是带参的拷贝构造函数,参数是该类的一个引用,原型类似B(const B& b)。若没有,默认系统会自动生成一个,行为是对数据成员直接赋值操作,这样是为什么对于有指针成员的类必须自己写拷贝构造函数,因为直接赋值指针会造成操作错误。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
HiHotzenplotz
2013-08-30 · TA获得超过439个赞
知道小有建树答主
回答量:345
采纳率:62%
帮助的人:162万
展开全部
因为 B c(b);这一句调用的是默认的复制构造函数,是编译自动生成的。

你可以加上这一句就明白了
B(B&b){x=b.x;cout<<"调用复制构造函数"<<x<<endl;}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wang20064412
2013-08-30 · TA获得超过219个赞
知道小有建树答主
回答量:149
采纳率:66%
帮助的人:82.2万
展开全部
B c(b); 调用的是拷贝构造,你没有写,所以就调用了默认拷贝构造函数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式