C++가 내세우는 목표 중의 하나는, 클래스 객체를표준 데이터형을 사용하듯이 사용할 수 있게 만드는 것이다.
그러나 일반 변수나 struct를 초기화 하는 것처럼 class 객체를 초기화 할 수는 없다.
이와 같은 방법으로 class를 초기화 할 수 없는 이유는 데이터들이 private 접근 제어를 가지고 있어 프로그램이 데이터 맴버에 직접 접근할 수 없기 대문이다. 접근할 수 있는 유일한 방법은 맴버함수를 이용하는 것 (데이터 맴버들을 private 대신에 public으로 만들면 방금 살펴본 위와 같은 방법으로 데이터 맴버들을 초기화 할 수는 있으나 그것은 데이터 은닉이라는 클래스의 기본원칙을 위반하는 것이다.
● 생성자
모든 객체는 그것을 생성할때 초기화 하는 것이 바람직 하다 이를 위해서 c++은 새로운 개로운 객체를 생성하고 그들의 데이터 맴버에 값을 대입해 주는 클래스생성자 (class constructor)라는 특별한 맴버함수를 제공한다.
1. 객체를 선언할 때 프로그램이 자동으로 생성자를 호출한다는 것이다.
2. 생성자의 이름과 사용방법은 C++이 제공하고 사용자는 클래스 생성자의 정의만 제공한다
3. 생성자의 이름은 클래스의 이름과 같다.
4. 생성자는 리턴값이 없는데도 불구하고 void형으로 선언하지 않는다.
5. 생성자에는 데이터형을 선언하지 않는다.
다음은 이해를 위한 생성자 정의
stock::stock(const char * co, int n, double pr)
{
strncpy(company,co,29);
company[29]='\0';
shares = n;
share_val = pr;
set_tot();
}
● 생성자 사용하기
- 생성자의 명시적 호출
stock food = stock("world cabbage",250,1.25);
- 생성자의 암시적 호출
stock garment("furry mason", 50,2.5);
- new를 사용할 때 생성자 사용
stock * pstock = new stock("aaa",18,19.0);
stock 객체를 생성하고 전달인자를 통해 제공되는 값으로 그것을 초기화 한다 그러고 나서, 그 객체의 주소를 pstock 포인터에 대입한다.
이 경우에는 객체가 이름을 가지고 있지 않다. 그러나 그 포인터를 사용하여 객체를 다룰 수 있다.
● 디폴트 생성자
디폴트 생성자(default constructor)는 명시적인 초기화 값을 제공하지 않을 때 객체를 생성하는 데 사용하는 생성자이다. 즉 다음과 같은 선언에 사용되는 생성자이다.
stock stock1; // 디폴트 생성자를 사용한다.
이 명령문이 동작하는 이유는, 사용자가 생성자를 제공하지 않아도 C++(컴파일러)가 자동으로 디폴트 생성자를 제공하기 때문이다. 그것은 생성자의 디폴트 버전인데 아무런 일도 하지 않는다. 예를 들자면 다음과 같다고 보면 된다.
stock::stock() { }
사용자가 클래스의 어떤 생성자를 일단 정의한 후에는 그 클래스의 디폴트 생성자를 제공하는 책임이 컴파일러로부터 사용자에게 넘어온다 사용자가 디폴트가 아닌 stock(const char * co, int n, double pr) 같은 생성자를 제공하면서 디폴트 생성자를 제공하지 않으면 다음과 같은 선언은 에러가 된다. 에러가 발생하는 이유는 ,초기화되지 않은 객체의 생성을 사용자가 원하지 않을지도 모르기 때문이다.
● 디폴트 생성자 사용하기
- 디폴트 생성자를 암시적으로 호출
stock first;
- 디폴트 생성자를 명시적으로 호출
stock first = stock();
- 디폴트 생성자를 암시적으로 호출
stock *prelief = new stock;
● 디폴트 생성자 사용에 있어 주의점
stock first()
다음은 first()가 stock객체를 리턴하는 함수임을 나타내는 것이다. 디폴트 생성자를 암시적으로 호출할 때에는 괄호를 사용하면 안되다.
● 파괴자
객체의 수명이 끝나는 시점에서 프로그램은 파괴자(destructor)라는 무서운 별칭을 가진 특별한 맴버 함수를 자동으로 호출한다.
1. 생성자와 마찬가지로 파괴자도 리턴값을 가질수 없고 선언된 데이터형을 갖지 않는다.
2. 파괴자는 전달인자를 가지면 안 된다.
3. 일반적으로 사용자가 코드에 명시적으로 파괴자를 호출하면 안된다.
4. 정적 기억 공간의 클래스 객체를 생성한다면, 프로그램이 종료될 때 파괴자가 자동으로 호출된다.
5. 자동 기억공간의 클래스 객체를 생성한다면 그 객체가 정의된 코드 블록을 프로그램이 벗어날 때 파괴자가 자동으로 호출된다.
6. new를 사용하여 객체를 생성한다면 그 객체는 힙 메모리 또는 자유 기억공간에 저장되므로 그것의 메모리를 해제하기 위해 delete를 사용할 때 파
괴자가 자동으로 호출된다.
7. 프로그램은 어떤 작업들을 수행하기 위해 임시적인 객체를 생성할 수 있다 그러한 경우에 프로그램은 그 객체의 사용을 마쳤을 때 파괴자를 자동
호출한다.
- 파괴자의 원형
~stock();
stock::~stock()
{
}