[C++] 4. 복사 생성자

2011. 5. 24. 11:28C++


[C++] - 4

1. 초기화 방식
   int val = 20; // c 스타일 방식 초기화
   AAA a1 = 10; // c++ 에서는 묵시적으로  AAA a1(10); 으로 변환되기때문에 동일하다.

   int val(20); // c++ 에서는 묵시적으로 int val=20; 으로 변환되개때문에 동일하다.
   AAA a1(10); // c 스타일 방식 초기화

   ex>
   Person p2 = p1; // 이의미는 Person p2(Person p1) 로 자동변환된다는것을 말한다.
   즉, 이 코드가 실행되려면
   Person(const Person& p1) 생성자가 존재해야 이상없이 구동된다.
   <이가 선언되어 있지 않으면 컴파일은 이상없으나 런타임시 에러가 발생된다.>

2. 복사생성자
   오버로딩을 통한 생성자가 여러개가 존재

   * 디폴트 복사 생성자의 문제점: 얕은 복사에 의한 메모리 참조 오류가 발생 할수 있다.
  
   class AAA{
      AAA() {}
      AAA(int a){}
      AAA(const AAA& a){}
   }

class Person{
       private: char* name;
       Person(char* name) {
            name = new char(strlen(name)+1);
            strcpy(this->name,name);
       }
       ~Person(){
            delete []name;
       }
   }

   /**
       이코드는 자동으로 Person p2(Person)으로 변환된다.
       해당 생성자가 없으면 자동으로 디폴트 복사 생성자가 생성되나, 문제점이 있습니다.
       바로 얕은 복사가 일어나 메모리 참조 오류가 나올 수 있다는 것입니다.
       value값이 복사되지 않은채 p2의 name이 p1의 name 포인터의 value를 가리키게 되어
       소멸자가 호출될때 문제가 생기는 것입니다.

       따라서 메모리 오류가 안나오게 할려면 Person(const Person& p)를 수동으로 작업해주어야 합니다.
   */
   Person p2 = p1;


   결과 => 생성자가 메모리 동적할당이 있다면, 복사생성자도 반드시 수동 구현해주어야 한다.

3. 복사 생성자의 호출 시기
 - 기존에 생성된 객체로 새로운 객체를 초기화
   Person p1;
   Person p2 = p1;

 - 함수 호출시 객체를 값에 의해 전달

   void function(Person p){
        p.show();
   }

   int main() {
       Person p1(30);
       function(p1); // 여기에서 해당 function 매개변수 Person 의 p 에 복사생성자가 일어난다.
       return 0;
   }

 - 함수 내에서 객체를 값에 의해 리턴

   Person function(void){
        Person p(10);
 return p; // 값에 의한 Person 객체 전달, p 객체의 복사본을 리턴시키게 된다.
   }

   int main() {
 function();
 function().show(); // 10 출력
 return 0;
   }