c++ 复制构建器的问题

来源:百度知道 编辑:UC知道 时间:2024/06/21 19:27:37
为何 C1的复制构建打印第二次:

#include <iostream>
using namespace std;

class C1 {
public:
C1(){ }
C1(const C1 &rhs){cout<<"为何出现两次? "; }
void sayHello() { cout << "Hello\n"; }
};
class C2: public C1{
public:
C2() { }
C2(const C2& rhs) { }
void sayHello1(C1& rhs) { rhs.sayHello();}
void sayHello2(C1 ci) { ci.sayHello();}
};

int main(){
C2 c2;
C1 ci(c2);

c2.sayHello1 (ci);
c2.sayHello2(ci); //这里为什么会引起 C1的复制构建
return 0;
}

void sayHello2 (C1 ci) { ci.sayHello (); }
这里传递的参数是C1类型的,而C++默认是按值传参数,也就是传递一个复本,所以会再构建一个C1类型的ci。
如果是
void sayHello1 (C1 & rhs) { rhs.sayHello (); }
就是传引用参数,这里就不会有构建,因为函数操作的还是原来的对象,并可能对原对象修改。