2017-10-09 24 views
-2

저는 C++ 프로그래밍을 처음 접했고 두 멤버 모두 동일한 가치를 보여주는 부분에 머물러 있습니다. 왜 그런지 설명해 주시겠습니까? 미리 Thx.복사 생성자는 실제로 무엇을합니까?

#include<iostream> 

using namespace std; 

class test{ 
    public: 
    int all,sum; 

    test(int x){ 
     all=x; 
    } 

    test(test &a){ 
     all=a.all+5; 
     cout<<all; 
    } 

    void one(test m){ 
     cout<<endl; 
     cout<<endl<<m.all; 
     cout<<endl<<all; 
    } 
}; 

int main(){ 
    test a(10),b(a); 
    b.one(a); 
    return 0; 
} 
+1

. 또한 여러 변수 대신 한 줄에 하나의 선언/초기화 만 제안합니다. – CoryKramer

+0

복사 생성자는 원하는 모든 작업을 수행 할 수 있습니다. 일반적으로 멤버는 다른 객체에서 * this * 객체로 복사됩니다. –

+2

A * 디버거 *를 사용하면 StackOverflow에 게시하고 응답을 기다리는 것보다 빠르게이 질문에 대답 할 수 있습니다. –

답변

1

문제는 ab 모두 동일한 값을 가질 것이 아니다. 그들이하지 않기 때문에. 디버거에서는 a.all이 10이고 b.all이 15라고 예상했을 수 있습니다.

진짜 문제

는 값에 의해 one() a를 전달하는 것입니다, 그래서 컴파일러는 임시 복사본을 a을한다. 즉, 컴파일러는 복사 생성자를 사용하여 m을 복사하고 (one()이 종료되면 m을 삭제합니다). 따라서 m.all 값은 항상 원래 값이 아닌 5 씩 증가하는 값입니다. 당신의 예에서

, b.allm.all의 값은 가 복사 구성 모두 같은 a 객체로부터 만 있기 때문에, 같은 값으로을 발생합니다. 대신 one() (b.one(b);)에 b를 통과 시도하고 당신은 m.all, 당신은 대신 참조하여 m 매개 변수 를 취할 one()을 변경해야하는 문제를 해결하기 위해 20 대신 15

이 될 것입니다 것을 볼 수 있습니다 :

void one(const test &m) { 
    cout<<endl; 
    cout<<endl<<m.all; 
    cout<<endl<<all; 
} 

그런 식으로 임시 복사본이 필요하지 않습니다. aone()으로 전달하면 예상대로 그대로 a.all가 출력됩니다. bone()으로 전달하면 예상대로 그대로 b.all가 출력됩니다. 등등.


또한, 보조 노트에, 당신의 복사 생성자도 const를 참조하여 a 매개 변수를 복용해야한다 : 당신은 정말 제대로 코드를 포맷하는 방법을 배울 필요가

test(const test &a){ 
    all=a.all+5; 
    cout<<all; 
} 
+0

Thx! 그러나 당신은 또한 가치가 어떻게 동등하게되는지 나와 어떻게 설명 할 수 있습니까? 나는이 부분을 정말로 이해할 수 없었다. b.one (a)가 호출되면 어떻게됩니까? –

+0

@AshwinKumar : 답변을 업데이트했습니다. –