개발 언어/cpp

cpp 복사생성자 (copy constructor)

eeeun:) 2021. 12. 21. 15:42
반응형

복사 생성자(copy constructor)

자신과 같은 클래스 타입의 다른 객체에 대한 참조(reference)를 인수로 전달받아

그 참조를 가지고 자신을 초기화하는 방법

// 복사생성자선언
Robot::Robot(const Robot& r)

복사 생성자는 새롭게 생성되는 객체가 원본 객체와 같으면서도, 완전한 독립성 가짐

-> 복사 생성자의 대입은 깊은 복사(deep copy)를 통한 값의 복사이기 때문

 

깊은 복사가 뭔지 모른다면 아래 링크를 클릭!

https://developer-eun-diary.tistory.com/entry/cpp-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%AC%EC%99%80-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC

 

cpp 얕은 복사와 깊은 복사

얕은 복사 새롭게 생성하는 객체에 다른 객체의 값을 대입하고 싶을 때 대입 연산자(=)를 사용. Robot robot1("hi"); 대입 연산자를 이용한 객체의 대입은 얕은 복사(shallow copy) 얕은 복사(shallow copy)는

developer-eun-diary.tistory.com

 

상수로 선언된 참조자이며, type은 클래스(자기 자신)

복사 생성자는 기존 값을 복사해 전달하기에 값이 바뀌면 안돼서 const로 선언.

  • 정의하지 않으면 디폴트 복사 생성자가 생김(얕은 복사)
  • 복사 생성자를 새로 정의했다고 다 깊은 복사인 것은 아님.
  • 깊은 복사는 복사 생성자 내에 동적 할당된 새 객체 필요
class Robot {
public:
	char *name;
    
    // 생성자
    Robot(char* _name) {
    	//공간을 새로 할당해서 데이터를 입력
    	name = new char[strlen(_name) + 1];
        strcpy(name, _name);
    }
    // 복사 생성자 - 깊은 복사
    Robot(const Robot& r) {
    	//공간을 새로 할당해서 데이터를 입력
    	name = new char[strlen(r.name) + 1];
        strcpy(name, r.name);
    }
    // 복사 생성자 - 얕은 복사
    Robot(const Robot& r) {
    	// 주소값을 넣어줌
        name = r.name;
    }
}

 

728x90