오늘의 TIL 목차 (22.08. 30)
- 클래스 특성 - 캡슐화
- 클래스 - 생성자
- 클래스 - 소멸자
생성자
[ 생성자 ]
: 클래스에서 자동으로 선언 및 호출되는 객체 생성과 초기화를 목적으로 한 것
클래스명(매개변수)
{
몜버 변수 초기화;
};
class Dainn
{
private: // 클래스는 멤버 변수를 private으로 해주는 게 상책 (은닉화)
int m_iA;
public: // 생성자는 이름이 클래스명, 매개변수에 따른 함수 오버로딩 가능
Dainn() { m_iA = 0; }; // 기본 생성자, 생성자를 명시적 선언하지 않을 경우 자동 생성되는 생성자
Dainn(int _iA) { m_iA = _iA; }; // 생성자는 '대입을 통한 초기화'
}
※ 객체 생성 과정 : 1. 메모리 할당 2. 생성자 호출 (둘 중 한 개라도 동작하지 않으면 객체 생성 불가)
■ 기능 / 주의
- 생성자는 객체 생성 시 코드 내부적으로 자동생성(묵시적 생성)된다. (명시적으로 생성할 경우 자동 생성 X)
- 묵시적 생성 시 기본 생성자가 생성되며 명시적 생성 시 기본 생성자가 생성되지 않는다. (직접 생성해야 함)
- 생성자는 오버로딩이 가능하기 떄문에 매개변수에 따라 여러 개 존재할 수 있다.
- 오버로딩을 이용하여 원하는 생성자를 통해 매개변수를 초기화할 수 있다.
- 오버로딩 : 같은 이름의 함수가 매개변수의 타입, 갯수에 따라 구분되어 사용되는 것 - 생성자는 목적이 객체 생성이기 때문에 반환값이 필요 없다. ( void 타입 )
- 생성자는 함수처럼 호출해서 사용하는 것이 아니기 때문에 이름이 존재하지 않는다. ( 클래스명과 동일 )
- 객체 생성 시 생성자는 자동 호출되기 때문에 생성자를 호출하지 않아도 생성자 안의 내용을 자동 실행한다.
■ 예시
class.h
#pragma once
#include "Define.h" // Define.h는 구조체, #define 헤더파일
class cPlayer
{
private:
tInfo* m_tPlayer; // 동적할당을 위한 포인터 선언
public:
cPlayer(void);
~cPlayer(void);
public:
void Initialize(void); // 초기화
void Release(void); // 동적 할당 해제 함수
};
class.cpp
#include "stdafx.h"
#include "class.h"
cPlayer::cPlayer(void)
{
cout << "생성자 자동 호출" << endl;
}
main.cpp
void main(void)
{
// 객체 생성 시 1. 메모리 할당 2. 생성자 자동 호출 ( 무조건 둘 다 실행 시 객체 생성 )
// 객체 생성 구간에서 자동으로 기본 생성자 호출
cPlayer player;
return;
}
출력결과:
생성자 자동 호출
[ 소멸자 ]
: 클래스에서 함수가 종료될 때 자동으로 호출되는 것
~클래스명(void)
{
몜버 변수 초기화;
};
-
// class.cpp
#include "stdafx.h"
#include "class.h" // 선언부 헤더파일 포함
cPlayer::~cPlayer(void)
{
cout << "소멸자 자동 호출" << endl;
}
// main.cpp
#include "stdafx.h"
#include "class.h"
void main(void)
{
cPlayer player; // 클래스 cPlayer 자료형 타입의 player 객체 생성
return; // 함수 종료 구간에서 소멸자 자동 호출
}
출력 결과 :
소멸자 자동 호출
■ 기능 / 주의
- 소멸자는 생성자와 달리 void 매개변수 단 하나만 존재
- 소멸자를 명시적 선언할 경우 내부코드는 코드가 아닌 함수 ( ex. Release() )를 사용하는 것이 보편적.
- 소멸자는 함수의 delete, return에서 호출됨 (void 타입 경우 함수 끝에 눈에 안 보인느 return 있음)
- 소멸자 호출 순서는 후입선출 느낌으로 거꾸로 호출됨. (생성자와 호출 순서와 반대)
※ 동적 할당 calloc, malloc, free는 C 시절의 언어로 자동으로 생성자와 소멸자를 호출하지 않기 때문에 객체 생성 불가
- 힙 메모리에 4byte를 할당할 뿐 객체는 생성되지 않으니 사용 금지
'C++' 카테고리의 다른 글
| [TIL 21장] 이니셜라이저, const 멤버 변수/함수, static 멤버 변수/함수, this (0) | 2022.09.02 |
|---|---|
| [TIL 20장] string함수, explicit, 전방 선언 (0) | 2022.08.31 |
| [TIL 18장] OOP의 개념(+추상화), 클래스(4대 속성), 클래스 속성 - 은닉화(feat. 접근 제어 지시자), 파일 분리 (클래스 - 선언부 구현부) (0) | 2022.08.29 |
| [TIL 16장] 레퍼런스 (0) | 2022.08.18 |
| [TIL 15장] 파일 입출력(feat. errno_t, 경로) 및 지원함수 텍스트 모드(.txt) & 바이너리 모드(.dat) (0) | 2022.08.16 |