2013-01-01 103 views
0
#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的一部分,为什么它会被调用来处理这个拷贝构造函数?谢谢!

+4

构造? –

+1

@AshRj:我不认为这是相当重复的:这里用户想知道复制构造函数w.r.t的行为。组成,而不是继承。 –

+0

@MFFooz我的错误。已移除链接。 – asheeshr

回答

7

复制构造函数withCC(withCC&)被调用,因为composite的默认复制构造函数将调用其成员数据的所有复制构造函数。并且由于您有一个withCC对象作为composite类中的成员数据,因此会调用复制构造函数withCC(withCC&)。当以往任何时候都按值传递的对象作为参数传递给函数或

  • 回报

  • 2

    拷贝构造函数被调用

    • 当实例化一个对象,并从另一个对象或
    • 与值初始化它object by value from the function

    composite class的默认拷贝构造函数将调用其成员的拷贝构造函数,这就是为什么withCC(withCC&)正在打印。

    +1

    不,'Foo f2 = f;'不会调用'operator =',它会调用一个拷贝构造函数。它可能看起来像'=',但它实际上是建筑。 – Yakk

    +0

    @Yakk我提到,当对象传递给一个函数时,复制构造函数被调用。在这种情况下,函数是= overloading函数 – Alfred

    +0

    'operator ='on'composite'对象永远不会在原始海报的代码中被调用。与'operator ='没有交互发生,涉及'withCC(const withCC&)'。 – Yakk

    1

    陈述composite c2 = c; 将尝试复制对象通过复制构造函数但类复合没有用户定义的复制构造函数因此编译器的默认复制构造函数将用于您的情况。 而且要构造WOCC对象也创造复合因此对于WOCC建设用户定义复制与CC因为副本需要作出被调用

    相关问题