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;
	}

 

위에 구현해놓은 코드에 복사 생성자 정의를 추가하면 됨

 

실행 결과