생성자(constuctor)란 클래스의 인스턴스가 생성되는 시점에서 자동으로 호출되는 특수한 멤버 함수이다. 생성자 내에서 일반적으로 멤버 변수들을 초기화 시키거나 기타 객체 인스턴스를 생성하는데 필요한 작업들을 수행하게 된다.


class Rect {
   public:
       Rect(); // 생성자1 선언
       int width;
       int height;        
       ....

};
// 생성자 구현
Rect::Rect() { // 입력 인수 없는 생성자
   width = 0;
   height = 0;
}


생성자의 이름은 클래스의 이름과 같다. 생성자는 특별한 경우가 아니면 보통 public 멤버 함수이다. 또한 반환값이 없으며 그럼에도 불구하고 void 를 붙이지 않는다는 점에 주의해야 한다. 이렇게 생성자 있다면 다음과 같이 객체를 생성하는 시점에서


Rect rect1;


입력 인자가 없는 생성자가 호출되어 객체 생성에 필요한 작업을 수행하게 된다.


 생성자는 여러 개를 정의할 수 있으나 (constructor overloading) 이들 중 하나만 실행된다. 아래는 생성자가 두 개인 경우의 예이다.


class Rect {
   public:
       Rect(); // 생성자1 선언
       Rect(int iw, int ih); //생성자2 선언
       int width;
       int height;        
       ....

};
// 생성자 구현
Rect::Rect() { // 입력 인수 없는 생성자
   width = 0;
   height = 0;
}

Rect::Rect(int iw, int ih) { // 입력 인수가 두 개인 생성자
   width = iw;
   height = ih;
}


 

 생성자는 반환값이 없기 때문에 어떤 값도 return해서는 안되지만 중간에 실행을 멈추기 위해서 반환값이 없는 단순 return문은 사용할 수 있다. 만약 다음과 같이 생성자를 입력한다면 오류를 발생시킬 것이다.


Rect::Rect() {
   width = 0;
   height = 0;
   return 0; // 오류 발생

}


그리고 생성자는 여러 개를 중복하여 선언하고 구현할 수 있으나 각각의 입력 인수의 개수나 타입이 서로 달라서 구별되어야 한다. 즉, 이 경우 C++의 일반적인 함수 중복의 규칙에 따른다. 따라서 예를 들어 다음과 같이 여러 개의 생성자를 선언할 수 있다.


Rect();
Rect(int x);
Rect(double y);
Rect(int x, int y);


위에서 든 네 개의 생성자는 서로 입력 인수가 다르므로 다른 생성자이다. 단, 인스턴스 생성시에는 이 중 단 하나만 실행된다.


 생성자에게 입력 인자를 넘기려면 인스턴스 바로 뒤에 괄호로 묶어서 넘기면 된다.


Rect rect1; // 입력 인수가 없는 생성자 호출
Rect rect2(10,20); // 입력 인수가 두 개인 생성자 호출


이렇게 마치 함수를 호출하듯 객체명 뒤에 인자를 주면 입력 인자가 매치가 되는 생성자가 호출되게 된다. 즉, rect1이 생성될 때 Rect() 생성자가 호출되고 rect2가 생성될 경우에는 Rect(int iw, int ih) 생성자가 호출된다. 따라서 rect1의 내부 변수들은 모두 0으로 초기화 되어 있게 되고 rect2의 내부변수는 각각 10과 20으로 초기화가 되었다.


rect1.getArea(); // 0을 반환
rect2.getArea(); // 20을 반환


C++ 강좌 전체 목록 >>>


c{c++},n{c0019}


Posted by 살레시오
,