반응형
소멸자
클래스 이름과 동일한 이름의 멤버함수로
함수명 앞에 「~」 붙여 생성자함수 이름과 구별
#include <iostream>
using namespace std;
class A
{
int no;
public:
A() {}
~A(); // 마무리 할 작업이 없으면 굳이 명시할 필요는 없음
};
A::~A()
{
cout << "소멸자..." << endl;
}
int main(void)
{
A aa;
cout << "end main..........." << endl;
}
특징
• return type 명시할 수 없다.
• 자동으로 호출되는 멤버함수로 인수 전달 받지 않는 형식
• 체가 메모리에서 제거되기 전 마지막으로 호출되는 함수로
주로 마무리 작업 용도
• delete 키워드 동일한 역할
• friend, static, const로 둘 수 없다.
RAII(Resource Acquisition Is Initialization)
Bjarne Stroustrup의 “자원의 획득은 초기화이다”라는 말로
자원(resource)의 소멸(해제)은 소멸자에서 처리 하라는 말과 일맥 상통
개체가 선언된 범위(scope)를 벗어날 때
소멸자 호출하여 생명 주기(life time)에 맞추어 자원 해제
[예제 코드]
file open/close 구현하는 것에 있어서
아래와 같은 형식으로 주로 구현한다.
#include <stdio.h>
int main(void)
{
FILE* fp;
char buf[133];
fopen_s(&fp, "source.cpp", "r");
while (fgets(buf, 133, fp))
{
// 한 라인씩 읽으며 true or null 반환
printf("%s", buf);
}
fclose(fp);
}
생성자/소멸자 활용
#include <stdio.h>
class MFile
{
FILE * m_fp;
char m_buf[133];
public:
MFile() {}
MFile(const char * fname, const char *mode = "r");
~MFile();
void Print(void);
char * GetBuffer(void);
char * Read(void);
};
void MFile::Print(void)
{
int line = 1;
while (Read())
{
printf("[%03d] %s", line++, GetBuffer());
}
}
char * MFile::GetBuffer(void)
{
return m_buf;
}
char * MFile::Read(void)
{
return ::fgets(m_buf, 133, m_fp);
}
MFile::MFile(const char * fname, const char *mode)
{
::fopen_s(&m_fp, fname, mode);
}
MFile::~MFile()
{
::fclose(m_fp);
}
int main(void)
{
MFile gm("harbang.cpp", "r");
gm.Print();
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] 임시(temporary) 객체 (13) | 2025.04.26 |
---|---|
[C/C++] 메모리 영역(스택, 힙, 데이터 영역) (5) | 2025.04.20 |
[C/C++] 비트 필드 구조체 (8) | 2025.03.23 |
[C++] noexcept (3) | 2025.03.20 |
[C++] RAII & stack unwinding (1) | 2025.03.19 |
댓글