C++ 생성자의 깊은 복사(Deep copy)와 관련된 질문입니다.
조회수 3707회
아래 코드에서 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가 인자를 쉽게 못 건드리도록 하는 상수 역할, &은 주소연산자라는 것 정도만은 알겠지만요..
- 저렇게 인자안에 'const 클래스명& 인스턴스명(?)' 으로 쓰는게 어떤 역할을 하는 것인지..
- 그리고 그 아래줄에 mc.str은 어떤 의미인지 모르겠습니다.
- 첫 번째 생성자와 두 번째 생성자에서 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
-
-
댓글 입력