2017-02-05 16 views
0
using namespace std; 

class C { 

public: 

    char *s; 

    C(const char *s0) { 
     s = new char[strlen(s0)+1]; 
     strcpy(s,s0); 
    } 

    C(C &c) { 
     s = new char[strlen(c.s)+1]; 
     strcpy(s,c.s); 
    } 
}; 

int main(int argc, char* argv[]) { 

    C c("cde"); 
    C c0(c); 

    cout << c.s << endl; 
    cout << c0.s << endl; 

    c.s[1] = 'X'; 

    cout << c.s << endl; 
    cout << c0.s << endl; 
} 

포인터와 참조에서 어떤 일이 일어나고 있는지 잘 모르겠습니다. 아무도 왜 두 번째 c0.s 출력이 여전히 "cde"인지 설명 할 수 있습니까? 고맙습니다.C++ 복사 생성자는 이유를 설명 할 수 있습니까?

+1

읽어? 그리고 왜? –

+1

* copy *를 작성했기 때문에? – juanchopanza

+0

'c0'는 사본이므로'c'를 변경해도 영향을 미치지 않습니다. – Galik

답변

2

복사 생성자는 새로운 버퍼

s = new char[strlen(c.s)+1]; 

을 만들고

strcpy(s,c.s); 

그래서 두 개체가 별도의 버퍼를 포함하는 새로운 버퍼에 원래의 버퍼의 내용을 복사한다. 하나의 오브젝트를 수정하면 해당 오브젝트의 버퍼가 수정되므로 다른 오브젝트로 변경 사항이 블리드되지 않습니다. 복사 생성자가 기본 복사 동작을 복제이

C(C &c) { 
    s = c.s; 
} 

같은 것을 보았다

경우 두 개체가 동일한 버퍼를 참조 할 하나의 변경은 다른에 나타납니다.

소멸자가 버퍼를 삭제하고 버퍼에 할당 된 저장소의 누출을 방지하기 위해 구현 된 경우 이는 치명적입니다. 하나의 객체를 파괴하면 둘 모두에 대해 버퍼가 해제되고 조만간 유효하지 않은 버퍼가 액세스되거나 삭제됩니다. 자세한 내용은

는`c0.s` 될 것으로 예상된다 무엇 What is The Rule of Three?