为什么在程序中调用这个复制构造函数
Why this copy-constructor is invoked in the program?
#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;
会导致复制构造函数被执行。但是如下所示,WITHCC
是class composite
的一部分,为什么要调用它来处理这个复制构造函数?谢谢!
之所以调用复制构造函数withCC(withCC&)
,是因为composite
的默认复制构造函数将调用其成员数据的所有复制构造函数。由于在composite
类中有一个withCC
对象作为成员数据,因此调用复制构造函数withCC(withCC&)
。
复制构造函数被称为
- 当实例化一个对象并用另一个对象的值初始化它或
- 当你将一个对象作为参数传递给函数或
- 从函数 返回对象的值
composite
类的默认复制构造函数将调用其成员的复制构造函数,这就是withCC(withCC&)
被打印的原因。
statement composite c2 = c;将尝试通过复制构造函数复制对象,但类composite没有用户定义的复制构造函数,因此编译器的默认复制构造函数将在您的情况下使用。并且您想要构造WOCC对象也通过创建composite因此对于WOCC构造,使用cc的用户定义复制构造函数被调用
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 复制构造函数、赋值运算符C++
- std::ofstream 作为类成员删除复制构造函数?
- 复制构造函数C++无法正确复制指针
- 关于复制构造函数的一个棘手问题
- 为什么调用复制构造函数而不是移动构造函数?
- 填充上编译器生成的复制构造函数之间的不一致
- C++ 对象指针数组的复制构造函数
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 防止在复制构造函数中隐式调用基构造函数
- 为用户定义的类正确调用复制构造函数/赋值运算符
- 具有已删除移动和复制构造函数的类的就地构造
- 复制构造函数隐式转换问题
- 复制构造函数中的递归调用