这个题目答案是AACC,但是我不知道为什么,请各位程序员帮忙解答一下,谢谢
首先,你写那个aabc完全没有道理,因为无论如何,程序只能输出a c,就没有输出b的逻辑
然后
A a, b 这个会调用构造函数,输出2个A
b = f(a) 会调用2次拷贝构造函数,一次是参数a传入,一次是返回值传出让b接收,所以输出2个C
所以AACC
两个C是因为函数f调用复制构造函数打印的,一般在以下四种情况会调用:
1.将新对象初始化为一个同类对象
2.按值传递对象给函数
3.函数按值返回对象
4.编译器生成临时对象
由于函数按值传递是生成副本,因此复制构造函数利用a生成了副本,打印C
函数同样也按值返回,因此同样复制构造函数利用a的副本,初始化了b
如果要避免函数生成副本,使用复制构造函数,需要按引用传参。
需要注意的是,复制构造函数如果不显式定义,也是会默认提供的。但如果A类中有const char *,而且不显式定义复制构造函数,按值传递往往会造成严重后果。