객체를 생성할 때 기본 자료형처럼 초기값을 주게하는 멤버함수
class 클래스이름
{
public:
클래스이름(); // 매개변수 없는 생성자
클래스이름(자료형 매개변수이름); // 매개변수 있는 생성자
}
생성자를 명시적으로 정의하지 않으면 컴파일러가 만드는 매개변수 없는 생성자
class Specialty
{
// 생성자가 어떤 것도 없으면 기본 생성자가 자동 생성됨
}
class Specialty
{
public:
Specialty() // Initialize 함수의 이름만 바꾸고 반환형을 지움
{
cout << "매개변수 없는 생성자 호출" << endl;
m_posX = 0;
m_posY = 0;
spawnCount++;
}
protected:
int m_posX;
int m_posY;
static int spawnCount;
}
int Specialty::spawnCount = 0;
int main()
{
Specialty a;
}
// 출력 결과
// 매개변수 없는 생성자 호출
class Specialty
{
public:
Specialty()
{
m_posX = 0;
m_posY = 0;
spawnCount++;
}
Specialty(int value) // 정수 매개변수 하나를 받는 생성자
{
m_posX = value;
m_posY = value;
spawnCount++;
}
Specialty(int x, int y) // 정수 매개변수 두 개를 받는 생성자
{
m_posX = x;
m_posY = y;
spawnCount++;
}
protected:
int m_posX;
int m_posY;
static int spawnCount;
}
int Specialty::spawnCount = 0;
int main()
{
Specialty b(1);
Specialty c(1, 2);
}
// 출력 결과
// 매개변수 1개 생성자 호출
// 매개변수 2개 생성자 호출
생성자도 함수의 일종이므로 매개변수의 개수나 자료형을 달리해서 여러 번 정의할 수 있는 것
class 클래스이름
{
public:
클래스이름(int 매개변수이름 = 0); // 객체를 생성할 때 인자를 적지 않으면 이 생성자가 불리며 0이라는 값을 인자로 넣어준 것처럼 됨
}
class 클래스이름
{
public:
클래스이름(); // 매개변수 없는 생성자
클래스이름(자료형 매개변수이름); // 매개변수 있는 생성자
}
클래스이름::클래스이름(자료형 매개변수, 자료형 매개변수2) : 멤버변수(매개변수), 멤버변수2(매개변수2)
{
}
이전 글에서 얕은 복사와 깊은 복사에 대해서 설명했었다. 복사 생성자가 깊은 복사를 하기 위함이고 이전 글에서 복사 대입 연산자와 같이 포인터 변수에 들어있는 값 자체 또한 복사하기 위해서 사용된다.
클래스이름(const 클래스이름& 매개변수이름); // 참조형이기에 복사하는 것의 값을 변경하지 않기 위해 const 키워드 삽입
class Specialty
{
public:
Specialty(const Specialty& original)
{
cout << "복사 생성자 호출" << endl;
m_posX = original.m_posX;
m_posY = original.m_posY;
spawnCount++;
}
// 멤버변수 생략
}
// 함수를 정의하고 선언할 때 매개변수로 객체가 들어가는 상황
반환형 함수이름(클래스 객체이름); // 매개변수로 복사 생성자 호출됨
함수에 넣은 인자도 매개변수에 복사될 때 복사 생성자가 호출된다. 그래서 만약 객체의 복사 비용이 크거나, 새로운 지역 객체로 만들어야할 필요가 없다면 참조 객체로 선언하여 사용하는 것이 좋다. 객체를 반환할 때도 동일하다.
void Test(Specialty b)
{
}
int main()
{
Specialty a;
cout << "직전 Test" << endl;
Test(a);
cout << "직후 Test" << endl;
}
// 출력 결과
// 매개변수 없는 생성자 호출 // a 변수의 생성자
// 직전 Test
// 복사 생성자 호출 // 매개변수 b 변수의 생성자, 복사 생성자가 호출됨
// 소멸자 호출 // 매개변수 b 변수의 소멸자
// 직후 Test
// 소멸자 호출 // a 변수의 소멸자
Test 함수를 호출할 때 매개변수 b에 복사 생성자를 호출하여 a의 값이 복사되는 것을 볼 수 있다.
객체가 소멸할 때 실행되는 멤버함수
class 클래스이름
{
public:
~클래스이름(); // 소멸자
}
class Specialty
{
public:
// 생성자 생략
~Specialty()
{
cout << "소멸자 호출" << endl;
spawnCount--;
}
// 멤버변수 생략
}
int main()
{
Specialty a;
Specialty b(1);
Specialty c(1, 2);
Specialty d(a);
Specialty e = a;
}
// 출력 결과
// 매개변수 없는 생성자 호출
// 매개변수 1개 생성자 호출
// 매개변수 2개 생성자 호출
// 복사 생성자 호출
// 복사 생성자 호출
// 소멸자 호출
// 소멸자 호출
// 소멸자 호출
// 소멸자 호출
// 소멸자 호출
main 함수의 끝에 도달할 때 5개의 객체 또한 지역변수이므로 같이 소멸되어 소멸자 내의 출력문이 호출되는 것을 볼 수 있다. main 함수가 아니더라도 새로 정의한 함수 내에서 지역변수로 객체를 사용한 후 그 함수가 종료될 때 그 객체의 소멸자가 호출된다.