为什么构造函数和析构函数调用次数不同,分别是哪个对象调用了构造函数和析构函数

 我来答
splashchaos
2012-11-11 · TA获得超过1.1万个赞
知道大有可为答主
回答量:3342
采纳率:0%
帮助的人:3648万
展开全部
这个问题其实隐含了2个技术问题。 你如果能在class的定义中中添加“拷贝构造”函数如下:
class xiexin
{
public:
...

xiexin(const xiexin&) {cout << "copy contructor" << endl;}

...
}
情况就比较清楚;
① 构造函数+拷贝构造的调用次数=析构函数的调用次数。
因为你的友元display()和静态成员calculate()的传人参数都是按值传递的,结果就要先构造一个类的临时对象, 然后调用拷贝构造来给它赋值。
② 但似乎临时对象的缺省构造函数没有被调用。 这就和具体的编译器技术有关了。现代的编译器都比较智能,为了提高效率,都能省略构造函数的调用(因为有的类会比较大, 构造函数又可能慢,反正还要拷贝的, 所以一般都分配一块内存,有可能零填充一下,然后后面再调用拷贝构造来初始化, 相当于2合1的简化),因此你只能看到拷贝构造被调用,而构造没有被调用的情况。
③ 你要是把display和calculate的参数都修改为引用,即

static int calculate(xiexin& obj);
friend void display(xiexin& obj);
再输出看看? 一共只有2次构造和2次析构, 成对出现了~~

又: 为了醒目, 你的两个构造函数,在输出前可以分别添加"Constructor 1 "和"Constructor 2 "以方便记数(注意1和2后面要有一个空格)。
563351684
2012-11-01 · TA获得超过126个赞
知道答主
回答量:61
采纳率:0%
帮助的人:70.3万
展开全部
只要你创建了对象就会调用构造函数 包括你传参数时 参数为对象也会调用,当程序运行遇到大括号时就会隐式调用析构函数 并不一定两者次数会一样 额 下班了 只能说这么多了 88
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式