본문 바로가기

프로그래밍/C ++

[C++]생성자

생성자(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