请教一个关于c++构造函数和析构函数的问题.

#include<iostream>usingnamespacestd;classBottle{private:intoz;public:Bottle(intx){oz=... #include<iostream>
using namespace std;
class Bottle
{
private:
int oz;
public:
Bottle(int x){oz=x;cout<<"ctor for "<<oz<<endl;}
Bottle(){oz=10;cout<<"ctor for 10"<<endl;}
Bottle(Bottle &bo){oz=bo.oz;cout<<"复制构造函数"<<endl;}
void set(int o) {oz=o;}
void drink(){--oz;}
~Bottle() {cout<<"dtor for "<<oz<<endl;}
};
int main()
{
Bottle * carton;
carton=new Bottle[3];//调用三次构造函数
for(int i=0;i<3;++i) {
carton[i]=(i+3);//问题: 这里为什么会调用构造函数, 并且还调用了析构函数????
}
cout<<endl;
carton[0].drink();
carton[1].drink();
carton[2].drink();
delete []carton;//调用析构函数
carton=NULL;
return 0;
}

程序运行结果为:
ctor for 10
ctor for 10
ctor for 10
ctor for 3
dtor for 3
ctor for 4
dtor for 4
ctor for 5
dtor for 5

dtor for 4
dtor for 3
dtor for 2

问题见注释处.
按一楼说的理解的话,在这里为什么不调用我给出的拷贝构造函数, 而是调用系统合成的呢??
展开
 我来答
小李飞刀再飞刀
2009-03-23 · TA获得超过320个赞
知道小有建树答主
回答量:81
采纳率:0%
帮助的人:98.3万
展开全部
carton[i]=(i+3);//问题: 这里为什么会调用构造函数, 并且还调用了析构函数????
左边的carton[i]是Bottle对象,而右边i+3是一个int类型,在赋值的时候会进行类型转换。就是调用你提供的构造函数Bottle(int x)来得到Bottle临时对象并且赋值给carton[i]。
在本次循环结束的时候又会析构掉这个对象。
这里有一个重要的知识点,就是单个参数的构造函数具有类型转换的功能。如果你没有提供Bottle(int x)这个构造函数,那么carton[i] = i+3;这样的语句是不会编译通过的。
qiangouyilang
2009-03-23 · 超过10用户采纳过TA的回答
知道答主
回答量:33
采纳率:0%
帮助的人:38.9万
展开全部
涉及到类之间的赋值运算。
先生成一个中间对象,调用一次构造函数
将中间对象初始化为i+3,
再调用系统默认的拷贝构造函数,
将中间对象拷贝给carton[i]。然后再析构掉中间对象。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式