객체 생성 시 단 한번 호출되는 함수.

생성자는 다음의 형태를 띈다.

  • 클래스의 이름과 함수의 이름이 동일하다.
  • 반환형이 선언되어 있지 않으며, 실제로 반환하지 않는다.

생성자는 아래의 특성을 갖는다.

  • 생성자도 함수의 일종이니 오버로딩이 가능하다.
  • 생성자도 함수의 일종이니 매개변수에 디폴트 값을 설정할 수 있다.

아래는 생성자의 예시이다.

 
#include <iostream>
 
using namespace std;
 
class SimpleClass
{
	private :
		int num1;
		int num2;
 
	public :
		SimpleClass()
		{
			num1=0;
			num2=0;
		}
 
		SimpleClass(int n)
		{
			num1=n;
			num2=0;
		}
 
		SimpleClass(int n1, int n2)
		{
			num1=n1;
			num2=n2;
		}
 
		/*
 
		//이 단락을 주석해제하고 SimpleClass sc2(100); 과 같이 객체 생성을 시도할 경우 컴파일 에러가 발생한다. SimpleClass(int n)과 이 단락의 생성자 중 뭘 호출해야 할 지 명확하지 않기 때문이다.
 
		SimpleClass(int n1=0;,int n2=0)
		{
			num1=n1;
			num2=n2;
		}
		*/
 
		void ShowData() const
		{
			cout<<num1<<' '<<num2<<endl;
		}
};
 
int main(void)
{
	//생성자를 정의한 경우 객체생성과정에서 자동으로 호출되는 생성자에게 전달할 인자의 정보를 다음과 같이 추가해야 한다.
	SimpleClass sc1;
	sc1.ShowData();
	SimpleClass sc2(100);
	sc2.ShowData();
	SimpleClass sc3(100, 200);
	sc3.ShowData();
 
	return (0);
}
 
/*
실행결과
 
0 0
100 0
100 200
*/
 

생성자도 아래의 예제와 같이 private으로 선언될 수 있다. 이 경우, 클래스 내부의 객체를 초기화시키는 데에만 사용할 수 있다.

 
//PrivateConstructor.cpp
 
#include <iostream>
 
using namespace std;
 
class AAA
{
	private :
		int num;
 
	public :
		AAA() : num(0) {}
 
		AAA &CreateInitObj(int n) const
		{
			AAA *ptr = new AAA(n);
			return (*ptr);
		}
 
		void ShowNum() const { cout<<num<<endl; }
 
	private :
		AAA(int n) : num(n) {}
};
 
int main(void)
{
	AAA base;
	base.ShowNum();
 
	AAA &obj1 = base.CreateInitObj(3);
	obj1.ShowNum();
 
	AAA &obj2 = base.CreateInitObj(12);
	obj2.ShowNum();
 
	delete &obj1;
	delete &obj2;
 
	return (0);
}
 

생성자를 정의하지 않으면, 컴파일러의 의해 디폴트 생성자가 자동으로 삽입된다.
객체 내부의 멤버로서 존재하는 객체는 멤버 이니셜라이저를 통해 초기화될 수 있다.


참고자료

윤성우의_열혈_cpp_프로그래밍