객체 생성 시 단 한번 호출되는 함수.
생성자는 다음의 형태를 띈다.
- 클래스의 이름과 함수의 이름이 동일하다.
- 반환형이 선언되어 있지 않으며, 실제로 반환하지 않는다.
생성자는 아래의 특성을 갖는다.
아래는 생성자의 예시이다.
#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);
}
생성자를 정의하지 않으면, 컴파일러의 의해 디폴트 생성자가 자동으로 삽입된다.
객체 내부의 멤버로서 존재하는 객체는 멤버 이니셜라이저를 통해 초기화될 수 있다.
참고자료