본문 바로가기
컴퓨터/C++

c++의 여러가지 생성자들

by 김짱쌤 2015. 3. 10.

여러가지 생성자

1.디폴트 생성자

  • 클래스 만들면 기본으로 깔리는 생성자 혹은 인수가 하나도 없는 생성자.
  • 다른 생성자가 생기면 기본빵 생성자는 사라진다.
  • 기본빵 생성자는 보통 멤버변수들에게 0이나 NULL값을 넣어주지만,
    쓰레기값에 주의하면서 직접 디폴트 생성자를 만들어 주는 편이 좋다.
  • 인수가 1개 이상 있는 생성자만 있으면 기본빵 생성자는 사라졌으므로 아래 코드는 오류가 난다.
  • 값 안넣고 선언하고 싶다면 디폴트 생성자를 만들어야 한다.
class CClass
{
public:
   CClass(int a){
      m_Num = a;
   }
   int m_Num;
}

CClass(); //오류
CClass classArr[MAX_ARR_NUM]; //오류
//배열 초기화할때 아무 값도 없으니까 디폴트 생성자를 호출할 건데 그게 없으니까 오류나는 것임!
CClass classArr[MAX_ARR_NUM] = {CClass(1), CClass(2), CClass(3)}; //오류안나는 코드

2.복사 생성자

  • 복사 생성자
CClass dstClass = srcClass; 
//실제 컴파일러가 위를 처리하는 방식
CClass dstClass(const &srcClass); //이게바로 복사생성자!

//좀더 복잡한 경우
int func(srcClass);  //직접 클래스를 인자로 넘길때도 복사생성자가 호출
//실제로는
int func(CClass argvClass(const &srcClass));

//이거 때문에 레퍼런스가 필요한 것임! 복사생성자 재귀호출의 문제
CClass dstClass(const srcClass); //이거 오류난다. 꼬꼬물
  • 기본 복사생성자의 동작원리 = 멤버별 대입연산
  • 메모리 할당된 포인터가 복사된 경우 파괴자가 호출되면 다른쪽의 멤버변수가 이미 해제된 상태!
  • 이런 쓰레기같은 커플링은 OOP를 해치고 나라와 내 민족을 해치고 그전에 오류가 난다.
  • 따라서 깊은 복사생성자가 요청된다. (말인 즉슨, 직접 만들어야 된다.)
Person(const Person &Other) {
     m_Name=new char[strlen(Other.m_Name)+1];
     strcpy(m_Name,Other.m_Name);
     m_Age=Other.m_Age;
}

3.초기화 리스트

  • 시작하기 전에 말하고 싶은것
int a = 0;
int a(0);
//int 생성자를 생각해보면 위는 같은 코드
  • 초기화 리스트는 위의 생성자를 사용해서 만드는 것같다.
Position(int ax, int ay, char ach) 
{
   x = ax, y = ay, ch = acy;
}
Position(int ax, int ay, char ach) 
   : x(ax),y(ay),ch(ach)
{
}
//위아래의 결과는 같다. 하지만 실제로 돌아가는 개념은 다르다.
int a = 0; //초기화 연산과
int a; a = 0; //초기화 후 대입 연산의 차이!
  • 상수나 레퍼런스는 초기화 이후에는 대입연산을 할 수 없으므로 객체 멤버로 상수나 레퍼런스를 사용한다면 반드시 초기화 리스트를 통해서 초기화해주어야 한다.
  • 다른 클래스 자체를 멤버로 갖는경우(흔치 않지만), 초기화 리스트를 통해 초기화 시켜줄 수도 있다.


'컴퓨터 > C++' 카테고리의 다른 글

c++ 함수포인터 부터 std::function까지  (0) 2015.03.10
FSM과 State 패턴  (0) 2015.03.10
c++의 static 변수에 대하여  (0) 2015.03.10
c++의 가상함수  (0) 2015.03.10