C++ 생성자의 깊은 복사(Deep copy)와 관련된 질문입니다.

조회수 3687회

아래 코드에서 public의 두번째 생성자 부분의 코드가 이해가 안 가서 질문드립니다. 코드의 역할은 http://blog.eairship.kr/168 자료에 따르면.. 메모리 공간 할당 후 문자열을 복사하고 그 다음에는 할당된 메모리의 주소를 str에 저장한다고 합니다. 하지만 아래 코드가 어떻게 그 역할을 수행하는 것인지 이해가 가지 않습니다.

        MyClass(const MyClass& mc){
            str = new char[strlen(mc.str)+1];
            strcpy(str, mc.str);

위 코드에서 인자안에 const MyClass& mc 라는 부분이 우선 이해가 가지 않습니다. const가 인자를 쉽게 못 건드리도록 하는 상수 역할, &은 주소연산자라는 것 정도만은 알겠지만요..

  1. 저렇게 인자안에 'const 클래스명& 인스턴스명(?)' 으로 쓰는게 어떤 역할을 하는 것인지..
  2. 그리고 그 아래줄에 mc.str은 어떤 의미인지 모르겠습니다.
  3. 첫 번째 생성자와 두 번째 생성자에서 strlen(aStr)+1라는 부분이 있는데 aStr의 글자수 +1 만큼 동적할당해주는 부분이니까 +1 대신 다른 숫자를 넣거나 없애도 상관 없나요? 아니면 +1에 그 외에 다른 기능이 있어서 수정하면 안 되는 부분일까요??

참고로 아래는 위 코드가 포함된 전체 코드입니다.

//Deep Copy
#include <iostream>
using namespace std;

class MyClass
{
    private:
        char *str;
    public:
        MyClass(const char *aStr){
            str = new char[strlen(aStr)+1];
            strcpy(str, aStr);
        }
        MyClass(const MyClass& mc){
            str = new char[strlen(mc.str)+1];
            strcpy(str, mc.str);*
        }
        ~MyClass(){
            delete []str;
            cout << "~MyClass() called!" << endl;
        }
    void ShowData(){
        cout << "str: " << str << endl;
        }
};

int main(){
    MyClass mc1("MyClass!");
    MyClass mc2 = mc1;

    mc1.ShowData();
    mc2.ShowData();
    return 0;
}
  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 깊은 복사는 다름이 아니라 객체를 복사할 때 단순히 객체를 복사하면 포인터 주소까지만 이뤄지니 복사대상이 된 객체가 사라지면 이 객체에 있던 포인터주소까지 사라지니 복사된 객체의 포인터주소도 더이상 쓸 수 없게 되겠죠. 그러니 값을 복사하기 위해서

     str = new char[strlen(mc.str)+1];
     strcpy(str, mc.str);
    

    를 수행하는겁니다. 1.const를 쓰는건 파라메터로 전달된 객체의 보호를 위한겁니다. &는... 기억이 정확히 나질 않네요 ㅋㅋ;; C++를 잘 안 건드리다보니 ㅜㅜ 객체를 참조하기 위한 연산자인 정도로만 기억합니다. 여튼 전달된 객체를 참조하겠죠. 그냥 값을 값이나 객체를 복사하기 보다 참조연산을 하면 효율적입니다.

    2,3 strlen 함수를 통해서 문자열의 길이를 알 수 있습니다만 +1하는건 null값까지 위함입니다. string으로 하면 이런 일이 필요 없지만 char배열을 쓰기 위해선 문자열의 맨 마지막엔 null이 들어가야 하니까요. 그래서 문자열 길이만큼 새로운 객체에 복사하기 위해 이런 과정을 거친겁니다. 그냥 new char[100] 한다음 문자열 마지막에 null넣어도 되지만 그럼 공간이 낭비 되겠죠?

    답변이 잘 됐나 모르겠네요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 감사합니다. null 값까지 포함한 문자열의 길이를 알고자 +1을 하는 것이군요.. 알 수 없는 사용자 2016.9.4 10:09
    • 그리고 strlen(mc.str)처럼 괄호안에 클래스나 구조체에서 호출할때 사용하는 '.' 이 들어가는 형식은 처음봐서 저 부분도 사실 잘 모르겠네요. mc변수 안의 str이라는 의미일까요? 알 수 없는 사용자 2016.9.4 10:12
    • 맞습니다 객체 mc의 변수를 참조한다는 의미입니다. 알 수 없는 사용자 2016.9.4 10:15
  • c++ 약간 차이가 있는데 & lvalue 파라미터입니다. 이에 대한 설명은 '&, && 참조 선언'으로 검색해보세요

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)