객체에는 특별한 멤버 함수인 생성자와 소멸자가 있다. 생성자가 호출되면 객체가 생성되고, 소멸자가 호출되면 객체가 정리된다.
생성자
생성자는 객체를 생성하는 멤버 함수이다.
생성자 내부에서 객체의 데이터 멤버를 초기화한다.
클래스를 정의할 때 멤버를 선언한다고 초기화가 이루어지는 것은 아니다. 선언 과정에서는 멤버의 이름과 자료형만 지정한다.
생성자는
1. 객체를 생성하고 데이터 멤버를 초기화하는 역할을 수행하므로 리턴값을 가질 수 없다.
2. 이름이 클래스의 이름과 같다.
3. 멤버를 초기화하려면 값을 변경해야 하므로 const 한정자를 붙일 수 없다.
4. 멤버 함수이므로 클래스 정의에서 선언해야 한다.
class Circle
{
public:
/*생성자*/
Circle(double radius); // 매개변수가 있는 생성자
Circle(); // 기본 생성자
Circle(const Circle& circle); //복사 생성자
};
매개변수가 있는 생성자
매개변수가 있는 생성자(parameter constructor)는 데이터 멤버를 지정된 값으로 초기화하기 위해 사용한다. 오버로드 할 수 있어서 여러 생성자를 만들 수 있다.
class Circle
{
public:
Circle(double radius); // 매개변수가 있는 생성자
};
기본 생성자
기본 생성자(default constructor)는 매개변수가 없는 생성자이다. 모든 데이터 멤버를 리터럴로 초기화 할 때 사용한다.
따라서 오버로드할 수 없다.
class Circle
{
public:
Circle(); // 기본 생성자
};
복사 생성자
복사 생성자(copy constructor)는 객체의 데이터 멤버를 다른 객체와 동일한 값으로 초기화하고 싶을 때 사용한다.
객체를 복사하면 같은 값을 갖는 다른 객체가 만들어진다. 매개변수로 자신과 같은 객체의 참조를 하나 받는다.
매개변수 앞에는 const를 붙여 원본 객체를 변경하지 못하게 한다.
class Circle
{
public:
Circle(const Circle& circle); //복사 생성자
};
생성자 정의
//매개변수가 있는 생성자 정의
Circle::Circle(double r)
:radius(r)
{
...
}
//기본 생성자 정의
Circle::Circle()
:radius(10)
{
...
}
복사 생성자 정의
Circle::Circle(const Circle& c)
:radius(c.radius)
{
...
}
생성자를 정의할 때 초기화 리스트(initialization list)를 사용해서 데이터 멤버를 초기화할 수 있다. 헤더와 본문 사이에 콜론(:)으로 시작하는 리스트를 넣으면 된다. 여러 데이터를 넣을 때는 쉼표로 구분한다.
소멸자
소멸자는
1. 객체가 스코프를 벗어날 때 자동으로 호출된다.
2. 클래스 이름 앞에 물결표(~)를 붙인다.
3. 리턴값을 가질 수 없다.
4. public을 적용해야 한다.
객체 내에서 파일을 여는 등의 작업이 끝나고 정리할 때 소멸자를 활용할 수 있다.
별도의 매개변수가 없으므로 오버로드할 수 없다.
class Circle
{
public:
...
//소멸자 선언
~Circle();
};
//소멸자 정의
Circle::~Circle()
{
...
}
객체는 스택에 생성된다. 가장 먼저 생성한 객체는 마지막에, 가장 마지막에 생성한 객체는 가장 먼저 파괴된다. 따라서 소멸자도 생성된 순서의 역순으로 호출된다.
호출
생성자를 호출하면 객체가 생성되고, 내부에서 데이터 멤버를 초기화한다.
소멸자는 객체가 파괴될 때 시스템이 호출하여 데이터 멤버를 정리한다. 소멸자를 호출하는 구문은 없다.
//매개변수가 있는 생성자
Circle circle1(1);
//기본 생성자 - 괄호 없이도 호출
Circle circle2;
//복사 생성자 - 이미 존재하는 cir 객체 복사
Circle circle3 (cir);
//소멸자 - 시스템이 자동으로 호출
필수 멤버 함수
(그룹1)매개변수가 있는 생성자, 기본 생성자는 하나 이상 있어야 한다. 둘 다 있어도 상관 없다. 없으면 합성 기본 생성자를 만든다.
(그룹2)복사 생성자는 하나 있어야 한다. 없으면 합성 복사 생성자를 만든다.
(그룹3)소멸자는 하나 있어야 한다. 없으면 합성 소멸자를 만든다.
합성 생성자, 합성 소멸자는 쓰레기 값으로 초기화하는 등 작성자가 원하지 않는 동작을 한다. 따라서 직접 구현하는 것이 좋다.
참고 서적
Forouzan, Behrouz A. 포르잔 C++ 바이블. 서울: 한빛아카데미, 2020.
'프로그래밍 > C, C++' 카테고리의 다른 글
포르잔 C++ 바이블 Ch.11 연습문제 & 프로그래밍 문제 (1) | 2023.01.28 |
---|---|
[C++]vector를 2차원으로 선언하는 방법 (0) | 2022.12.27 |
[C++] 클래스의 구조 (0) | 2022.12.11 |
while 반복문을 종료하는 방법: 센티넬, EOF, 플래그 (0) | 2022.12.10 |
[C++] 조정자를 사용해 입출력 형식을 지정하는 방법 (0) | 2022.12.07 |