为什么在程序中调用这个复制构造函数

Why this copy-constructor is invoked in the program?

本文关键字:复制 构造函数 调用 程序 为什么      更新时间:2023-10-16
#include <iostream>
#include <string.h>
using namespace std;
class withCC
{
public:
    withCC() {}
    withCC(const withCC&) {
        cout<<"withCC(withCC&)"<<endl;
    }
};
class woCC
{
    enum {bsz = 100};
    char buf[bsz];
public:
    woCC(const char* msg = 0) {
        memset(buf, 0, bsz);
        if(msg) strncpy(buf, msg, bsz);
    }
    void print(const char* msg = 0)const {
        if(msg) cout<<msg<<":";
        cout<<buf<<endl;
    }
};
class composite
{
    withCC WITHCC;
    woCC WOCC;
public:
    composite() : WOCC("composite()") {}
    void print(const char* msg = 0) {
        cout<<"in composite:"<<endl;
        WOCC.print(msg);
    }
};
int main()
{
    composite c;
    c.print("contents of c");
    cout<<"calling composite copy-constructor"<<endl;
    composite c2 = c;
    c2.print("contents of c2");
}

运行结果如下:

$ ./a.out 
in composite:
contents of c:composite()
calling composite copy-constructor
withCC(withCC&)
in composite:
contents of c2:composite()

我不明白为什么withCC(withCC&)作为输出的一部分给出。我猜composite c2 = c;会导致复制构造函数被执行。但是如下所示,WITHCCclass composite的一部分,为什么要调用它来处理这个复制构造函数?谢谢!

之所以调用复制构造函数withCC(withCC&),是因为composite的默认复制构造函数将调用其成员数据的所有复制构造函数。由于在composite类中有一个withCC对象作为成员数据,因此调用复制构造函数withCC(withCC&)

复制构造函数被称为

  • 当实例化一个对象并用另一个对象的值初始化它或
  • 当你将一个对象作为参数传递给函数或
  • 从函数
  • 返回对象的值

composite类的默认复制构造函数将调用其成员的复制构造函数,这就是withCC(withCC&)被打印的原因。

statement composite c2 = c;将尝试通过复制构造函数复制对象,但类composite没有用户定义的复制构造函数,因此编译器的默认复制构造函数将在您的情况下使用。并且您想要构造WOCC对象也通过创建composite因此对于WOCC构造,使用cc的用户定义复制构造函数被调用