2013-02-23 3 views
0
class WithCC { // With copy-constructor 
public: 
    // Explicit default constructor required: 
    WithCC() {} 
    WithCC(const WithCC&) { 
    cout << "WithCC(WithCC&)" << endl; 
    } 
}; 

class WoCC { // Without copy-constructor 
    string id; 
public: 
    WoCC(const string& ident = "") : id(ident) {} 
    void print(const string& msg = "") const { 
    if(msg.size() != 0) cout << msg << ": "; 
    cout << id << endl; 
    } 
}; 

class Composite { 
    WithCC withcc; // Embedded objects 
    WoCC wocc; 
public: 
    Composite() : wocc("Composite()") {} 
    void print(const string& msg = "") const { 
    wocc.print(msg); 
    } 
}; 

저는 C++ 11 장 기본 복사 생성자에서 생각하고 있습니다. 위 코드의 경우 작성자는 "클래스 WoCC에는 복사 생성자가 없지만 해당 생성자는 print()을 사용하여 인쇄 할 수있는 내부 문자열에 메시지를 저장합니다.이 생성자는 Composite’s 생성자 이니셜 라이저 목록에서 명시 적으로 호출됩니다 ".기본 생성자 C++

Composite의 생성자에서 WoCC constrcutor를 명시 적으로 호출해야하는 이유는 무엇입니까?

+0

'WoCC'에는 복사 생성자가 있습니다. 선언하지 않았으므로 암시 적으로 선언 된 * 복사 생성자를 가져옵니다. – aschepler

답변

1

wocc은 기본적으로 암시 적으로 생성되므로 명시 적으로 생성하지 않아도됩니다. 기본 생성자는 인수가없는 생성자입니다. string을 사용하는 생성자에는 해당 문자열의 기본값이 있으므로 WoCC에는 기본 생성자가 있습니다.

이 경우에서와 같이 특정 문자열을 전달하려면 생성자를 명시 적으로 호출하면됩니다.

그러나 인수에 기본값 (예 : = "")이없는 경우 Composose에 올바른 생성자를 명시 적으로 호출해야합니다. 이는 자신의 생성자를 정의하면 컴파일러가 암시 적으로 기본 기본 생성자를 생성하지 않기 때문입니다. 기본 생성자가없는 경우 wocc 멤버에 대해 올바른 생성자가 호출되는지 확인해야합니다.

또한 WoCC에는 실제로 복사 생성자가 있습니다. 컴파일러는 정의하지 않으면 암시 적 복사본 생성자를 생성합니다 (이동 생성자를 제공하는 경우에만 delete d로 정의합니다).