c++析构函数调用问题:为啥调用了四次,而构造函数只调用了2次?

2025-03-21 11:41:55
推荐回答(3个)
回答1:

构造函数是由语句circle cobj(3,4);和circle cobq(5,6);调用的,另外两次是由复制构造函数生成临时类对象,发生在函数face()的参数传递的时候,由于你没有提供复制构造函数,系统会自动生成,所以程序结束前,需要4次调用析构函数。
对的,当使用引用传递时,无需用复制构造函数生成新的对象,那么析构函数只需2次就可以了。

回答2:

构造函数不是程序员调用,而是C++定义或生成对象时,由系统自动调用的。
在这里虽然调用了4次成员函数,但它们都没有生成对象,所以,不引发构造函数的调用。
代码中,定义了2个对象,所以,定义的这2个对象引发了2次构造函数的调用

回答3:

你是指face函数调用里面的那个形参吗?
这个问题讲起来很复杂,但是简单讲就是,对于面向对象的C++编译器,将会优化所有的函数形参,避免直接使用传值调用。
即便在代码中和c语言中一模一样是个传值调用,不是指针也不是引用,但是编译器本身将自动将传值进行优化,最起码的变成实参的一个引用。
在你的例子里面因为face函数并没用对a对象的成员进行修改,所以a就会变成实参的引用,这时候并没有申请一个新的类实例,也就不会执行构造函数了。