C++/clone code
[C++] student.cpp (복사 생성자의 개념)
year.number
2022. 6. 29. 00:07
복사 생성자
다른 객체의 내용을 복사해서 새로운 객체를 초기화하는 것
복사 생성자는 자신과 같은 타입의 객체를 매개 변수로 받음
얕은 복사
복사 생성자가 정의되어 있지 않은 경우 컴파일러가 알아서 디폴트 복사 생성자를 추가해줌
Car c1(0, 1, "grey");
Car c2(c1);
얕은 복사의 문제점
#include <iostream>
#include <string>
using namespace std;
class Student {
private:
char* name; // 이름
int number; // 학번
public:
//생성자
Student(const char* pn, int n) { //const 빠지면 컴파일 오류!
name = new char[strlen(pn) + 1]; //+1은 null문자 포함한 크기
strcpy(name, pn);
number = n;
}
~Student() {
delete[] name;
}
void setName(const char* pn) {
delete[] name;
name = new char[strlen(pn) + 1];
strcpy(name, pn);
}
void print() {
cout << "이름: " << name << " ";
cout << "학번: " << number << endl;
}
};
int main() {
Student s1("Kim", 2020120147);
Student s2(s1); //복사 생성자(default)
s1.print();
s2.print();
s1.setName("Park");
s1.print();
s2.print();
return 0;
}
실행 결과
[문제점]
복사 생성자에서 새로운 메모리 공간을 할당해서 복사한 것이 아니고, 단순히 포인터의 값(주소값)만 복사되었기 때문
[해결 방안]
깊은 복사
-> 디폴트X, 직접 복사 생성자 구현
//깊은 복사(복사 생성자 정의)
Student(Student& s) {
name = new char[strlen(s.name) + 1];
strcpy(name, s.name);
number = s.number;
}
위에 구현해놓은 코드에 복사 생성자 정의를 추가하면 됨
실행 결과