2012-06-08 3 views
9

저는 C++을 배우고 C++: The Complete Reference에서 복사 생성자를 읽었습니다. 해당 도서에 의하면둘 이상의 매개 변수가있는 복사 생성자

복사 생성자는 기본 인수가 정의되어있는 한 추가 매개 변수가 허용됩니다. 그러나 모든 경우에 첫 번째 매개 변수는 초기화를 수행하는 객체에 대한 참조 여야합니다.

그러나 나는 이러한 추가 매개 변수를 전달하는 방법을 혼동하고 있습니까? 나는 책에 나와 있지 않고 알아낼 수없는 어떤 방법이 있어야한다고 확신합니다. 누구든지 나를 도울 수 있습니까?

EDIT : 또한 하나의 오브젝트가 명시 적 선언

  • 같이 서로를 초기화 할 때 세가지 사례

    • 을 IE에서 이러한 추가적인 파라미터를 통과 할 때 물체의 사본 함수에 전달되도록 만든다
    • 임시 개체가 생성 될 때 (가장 일반적으로 반환 값으로)
  • +1

    _Herbert Schildt_ 님의 서적은 [커뮤니티] (http://stackoverflow.com/questions/18385418/c-meaning-ko)에 의해 [내려 봤습니다.] (http://www.seebs.net/c/c_tcn4e.html) 명령문 결합 typedef 및 typename # comment26999919_18385418). 그것은 각 페이지의 오류 양과 그것이 고백하는 나쁜 습관 때문입니다. [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?rq=1)는 좋은 선택에 도움이 될 것입니다. – legends2k

    답변

    13

    여기 간단한 예입니다 :이 예에서

    class A { 
        //... 
    public: 
        A (const A&, bool deep = false) { 
         if (!deep) { /* make a shallow copy */ } 
         else { /* make a deep copy */ } 
        } 
    }; 
    
    void foo (A x) { /*...*/ } 
    A bar() { /*...*/ return A(); } 
    A a_var; 
    

    , 매개 변수는 기본 복사 생성자가 얕은 것 즉, false로 디폴트됩니다.

    A b(a_var);  // b gets a shallow copy of a 
    foo(b);   // foo() receives a shallow copy 
    

    그러나 두 번째 매개 변수에서 true를 전달하여 딥 복사를 수행 할 수 있습니다.

    A b(a_var, true); // b gets a deep copy of a 
    foo(A(b, true)); // foo receives a shallow copy of a deep copy 
    

    마찬가지로, A를 반환하는 함수를 들어, 기본값을 사용하고 있기 때문에 반환 복사, 얕은 것이지만, 그것을받을 때 수신기는 깊은 수 있습니다. 당신이 복사 생성자를 정의 할 때

    A b(bar());  // shallow 
    A b(bar(), true); // deep 
    

    은 당신이 소멸자를 정의하고 할당 연산자 (세 가지의 규칙을) 오버로드해야합니다 의미하는 것입니다 기억하십시오.

    +0

    그리고 다른 2 가지 경우, 즉 객체를 값으로 함수에 전달하고 객체를 반환하는 것은 어떻습니까? ... 같은 질문을 업데이 트했습니다. –

    +0

    @RaviGupta : 입력 해 주셔서 감사합니다. – jxh

    1

    이렇게 생각하십시오. 생성자의 개념 만 있습니다. 컴파일러가 복사본을 만들 필요가 있다고 판단하면 T 유형의 단일 개체를 전달하여 호출 할 수있는 생성자를 찾습니다. 이 특별한 사용 사례 때문에 우리는 일반적으로 생성자를 "복사"생성자로 선택했습니다.

    관련 문제