생성자(Constructor)란
- 객체가 생성될 때 수행할 작업을 정의하는 특수한 멤버함수
- 생성자에 인수를 전달할 수 있도록 매개변수 선언
- 생성자 머리에 반환 자료형을 표시하지 않으며, retrun명령으로 값을 반환할 수 없음
- 생성자를 public으로 선언해야 클래스 외부에서 객체를 생성할 수 있음
class Counter {
int value;
public:
Counter(){ value = 0; }
...
}
초기화 리스트란?
생성자의 머리에 데이터 멤버를 초기화하는 값들을 나열한 리스트
데이터멤버이름{초깃값} 형태로 초깃값 지정
ex) Counter() : value{0} { }
소멸자 (destructor)
- 객체가 소멸될 때 수행할 작업을 정의하는 특수한 멤버 함수
- 클래스의 이름에 ~ 붙여 선언
- 소멸자 머리에 반환 자료형 표시하지 않으며, return명령으로 값 반환할 수 없음
- 매개변수가 없으며, 클래스에 하나의 소멸자만 정의 가능
- public으로 선언하는 것이 일반적이다.
- 상속을 통해 파생 클래스 정의한는 경우 virtual을 지정하여 가상함수가 되도록 하는 것이 좋음
- 형식
class ClassName{
....
public:
ClassName(fParameterList) {
...
}
~ClassName(){
...
}
...
}
class Person{
char* name;
char* addr; // 데이터 멤버
public:
Person(const char* name, const char* addr); //생성자
~Person(); //소멸자
void print() const ; //이름, 주소 출력
void chAddr(const char* newAddr);//주소변경
};
Person::Person(const char* name, const char* addr){
//이름 저장할 공간 할당
this -> name= new char[strlen(name)+1];
// name에 이름 복사
strcpy(this -> name, name);
this -> addr = new char[strlen(addr)+1];
strcpy(this -> adddr, addr);
cout << " Person 객체 생성함(" << name << ")" << endl;
}
...
Person::~Person() {//소멸자
cout << "Person객체 제거"<< endl;
delete [] name;
delete [] addr;
}
..
void Person::chAddr(const char* newAddr){
delete [] addr; //기존 공간 반납
// 새로운 주소에 맞는 공간 할당
addr = new char[strlen(newAddr)+1];
strcpy(addr, newAddr);
}
디폴트 생성자
매개변수가 없는 생성자, 또는 모든 매개변수에 디폴트 인수가 지정된 생성자
클래스를 선언할 때 생성자를 선언하지 않으면 컴파일러는 묵시적으로 디폴트 생성자를 정의함
- 묵시적 디폴트 생성자는 아무런 처리도 포함하지 않음
- ex) Counter() { } -> 데이터 멤버가 초기화되지 않은 상태로 객체가 만들어진다.
생성자를 하나라도 선언하면 컴파일러는 묵시적 디폴트 생성자를 정의하지 않음
디폴트 생성자가 없는 클래스
class CounterM {
const int maxValue;
int value;
public:
CounterM(int mVal): maxValue{mVal}, value{0} {} //매개변수를 갖는 생성자 선언
void reset() { value = 0; }
void count() {
value = value < maxValue ?
value + 1 : 0;
}
······
}
// 이런 경우 CounterM cnt(999); 와 같이 인수를 포함하는 객체 정의
// CounterM cnt2; //이러 발생 - CounterM은 디폴트 생성자가 없음.
객체 배열
기본 자료형의 배열을 만드는 것과 마찬가지이나, 객체의 경우에는 생성자가 호출되어야 한다는 점 염두해 둔다.
Counter cntArr[4]; // OK
Counter *pt = new Counter[10]; // OK
👉 cntArr에 4개의 Counter객체가 만들어지면서 각 객체마다 디폴트 생성자가 동작한다.
그러나 디폴트 생성자가 없는 클래스의 객체 배열은 위와 같이 선언할 수 없음
CounterM cntMArr[4]; // 에러! - 디폴트 생성자가 없어 생성자 호출 불가
//다음과 같이 배열 선언
CounterM cntMArr[4] = { CounterM(9), CounterM(99),CounterM(999),CounterM(9999) };
객체 배열을 new 연산자로 동적 할당을 할 때는 디폴트 생성자가 필요하다.
그렇지 않다면 초기화 인수를 전달할 수 없어 객체 배열 동적 할당 불가
반응형
'프로그래밍 > C ++' 카테고리의 다른 글
[C++] 클래스 (0) | 2024.12.05 |
---|---|
[C++] 연산자 다중 정의 (0) | 2024.12.04 |
[C++] 객체 (object) (0) | 2024.12.04 |
[C++] 함수 (0) | 2024.12.03 |
[C++] 자료형 (묵시적형변환) (0) | 2024.12.03 |