[c++] 생성자, 소멸자, 멤버초기화 목록
생성자와 소멸자
생성자(constructor)
- 초기값 제공, 초기화 절차를 실행
- 메모리공간이나 파일 같은 자원을 할당
- 객체 생성시 자동 호출
- 클래스이름과 동치
- 매개변수 가능
- 중복 정의 가능 *생성자 = 구성자
소멸자(destructor)
- 객체가 소멸되는 시점에 마무리 작업
- 동적 메모리 반납 등
- 객체 소멸시 자동 호출
- 클래스 이름 앞에 ~
- 매개변수 불가능
- 중복 정의 불가능
생성자의 외부정의
생성자도 멤버 함수와 마찬가지로 클래스 내 외부에서 정의가 가능하다.
- 클래스이름::생성자() 로 정의
생성자 중복정의
Car::Car()
{
cout << "디폴트 생성자 호출<< endl;
speed = 0;
gear = 1;
color = "white"
}
Car::Car(int s, int g, string c)
{
cout << "매개변수가 있는 생성자 호출<< endl;
speed = s;
gear = g;
color = c;
}
생성자 호출 방법
int main()
{
Car c1; // ①디폴트 생성자 호출
Car c2(); // ②생성자 호출이 아니라 c2()라는 함수의 원형 선언
Car c3(100, 3, "white"); // ③생성자 호출
Car c4 = Car(0, 1, "blue"); // ④이것은 먼저 임시 객체를 만들고 이것을 c4에 복사
return 0;
}
디폴트 매개변수
Car(int s=0, int g=1, string c=“red")
멤버 초기화 목록
멤버 초기화 목록(Member Initialization List)
- 생성자() : 멤버(매개 변수) 형식으로 작성
Car (int s, int s, string c) : speed(s), gear(g), color(c) - 사용하는 이유
- 멤버가 상수인 경우
- " 참조자인 경우
- " 객체인 경우
상수인 경우
- 객체가 생성되기 전까지 초기화가 연기
- 초기화 리스트로만 값을 초기화 가능
class Car
{
const int MAX_SPEED;
int speed; // 속도
public:
Car() : MAX_SPEED(300)
{
}
};
객체인 경우
- 생성자 안에서 다른 클래스의 생성자를 호출할 수 없다.
- 디폴트 값이 아닌 다른 값으로 초기화하기
class Point
{
int x, y;
public:
Point(int a, int b) : x(a), y(b) { }
};
class Rectangle
{
Point p1, p2;
public:
Rectangle(int x1, int y1, int x2, int y2) : p1(x1, y2), p2(x2, y2) { }
};
복사 생성자(Copy Constructor)
- 객체의 내용을 다른 객체로 복사
- 자동으로 디폴트 복사 생성자가 생성
public:
Car(int s, int g, string c) : speed(s), gear(g), color(c)
{
cout << "생성자 호출" << endl;
}
Car(const Car &obj) : speed(obj.speed), gear(obj.gear), color(obj.color)
{
cout << "복사 생성자 호출" << endl;
}
디폴트 복사 생성자
- 메모리 소멸에 비해 메모리 할당이 부족하다.
-> 즉 얕은 복사(shallow copy) 문제 발생
- 메모리 할당 시 멤버에 있는 주소값만 복사된다.
해결법
- 직접 복사 생성자를 구현 (deep copy)