minjeong-oh
기록
minjeong-oh
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • ML & Neural Net (3)
    • ◼️GNN (1)
    • ◼️시계열 (1)
    • ◼️추천시스템 (0)
    • ◼️수학 (3)
    • Data Engineer (2)
    • ◼️Spark (1)
    • ◼️Kafka (1)
    • ◼️Elestic Search (0)
    • ◼️Redis (0)
    • ◼️ClickHouse (1)
    • Programming Language (4)
    • ◼️React (0)
    • ◼️Git (1)
    • ◼️Python (1)
    • ◼️C++ (33)
    • ◼️Fortran 99 (2)
    • ◼️OpenGL (7)
    • ◼️MFC (35)
    • ◼️Flutter (46)
    • ◼️Kotlin (1)
    • ◼️Android (1)
    • ◼️Java (1)
    • ◼️C (4)
    • Development (0)
    • ◼️디자인패턴 (0)
    • ◼️네트워크 (2)
    • ◼️인증 (1)
    • Computer Science (4)
    • 알고리즘 문제풀이 (12)
    • SQL 고득점 Kit 문제풀이 (8)
    • 취업준비 (0)
    • Notion 정리 글 (1)
    • Article Scrap (12)
      • Careerly - Q&A (7)
      • Careerly - Post (2)
    • 기타 등등 (16)

블로그 메뉴

  • 글쓰기
  • 홈
  • 태그
  • 방명록
  • 편집

공지사항

인기 글

태그

  • hello테마
  • mfc
  • 19년식그램SSD장착
  • 그램업그레이드
  • SpringBootSwagger
  • 티스토리폰트배경색없애기
  • AI배워야하나
  • 구조체매개변수
  • NextJSSwagger
  • GSLB
  • 인공지능개발자
  • 19년식그램램장착
  • 그램풀스팩업그레이드
  • 이것이C++이다책참고
  • OpenGL회전
  • 리눅스파티션
  • 이차원구조체배열포인터
  • API문서정리
  • kafka구축
  • 구조체배열포인터

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
minjeong-oh

기록

◼️C++

[C++] 생성자와 소멸자

2023. 9. 17. 22:21

생성자와 소멸자

생성자 Constructor, 소멸자 Destructor
- 클래스 객체가 소멸될 떄 자동으로 호출되는 함수 (소멸자)
- 함수임에도 불구하고 반환 형식이 없다.
- 함수 이름이 클래스 이름과 같다.
- 소멸자 이름 앞에는 ~가 붙는다.
 
생성자와 소멸자의 차이점
- 생성자는 다중 정의할 수 있고 소멸자는 하나만 정의가능하다.
 
 디폴트 생성자 
- 매개변수가 하나도 없는 생성자
- 클래스 제작자가 디폴트 생성자와 소멸자를 기술하지 않아도 컴파일러가 알아서 만들어 넣는다.
- 아무런 코드도 추가되지 않지만 내부적으로 컴파일러가 만든다
- 생성자와 소멸자가 없는 클래스는 없다고 생각하면 된다.
 
 클래스가 소멸되는 시점
- 선언된 블록 범위가 끝나면 자동 소멸한다.

class CTest
{
public:
  CTest() {
  	cout << "CTest" <<endl;
  };
  ~CTest(){
  	cout << "~CTest" <<endl;
  };
};


int main(){
  cout << "Begin" <<endl;
  CTest t;  //main에속한 지역변수이기 때문에 main블럭이 끝나면 자동으로 소멸된다.
  cout << "End" <<endl;
  
  return 0;  
} //이블럭이 끝나고 인스턴스 t가 소멸된다.

결과
Begin
CTest
End
~CTest

 
CTest 클래스의 인스턴스를 전역변수로 선언했을 때 생성, 소멸 시점
- 전역 변수로 선언한 클래스의 생성자가 main() 함수보다 먼저 호출된다.
   : C로 작성한 프로그램에서 가장 먼저 호출되는 함수는 main()함수다.라는 명제와는 다르다는 점 꼭기억!
- 메인함수가 끝난 후에 소멸자가 호출된다.

class CTest
{
public:
  CTest() {
  	cout << "CTest" <<endl;
  };
  ~CTest(){
  	cout << "~CTest" <<endl;
  };
};

CTest t; 

int main(){
  cout << "Begin" <<endl;
  cout << "End" <<endl;
  
  return 0;   //End다음 ~CTest가 출력된다.
}

결과
CTest
Begin
End
~CTest

 
새로운 생성자를 정의한다면 디폴트 생성자는 컴파일러가 정의하지 않는다.

class CTest
{
  int m_nData;
  
public:
  CTest(int nParam):m_nData(nParam){
  	cout << "CTest" <<endl;
  };
  
  ~CTest(){
  	cout << "~CTest" << m_nData <<endl;
  };
  
  
  //디폴트 생성자가 생성되지 않는 것을 명시적으로 표시하기위해 delete 예약어를 사용해서 생성자를 삭제해준다.
  CTest(void) = delete;
};


int main(){
  CTest a(1);
  CTest b(1);
  
  CTest c;  // (오류발생) 디폴트 생성자가 생성되지 않으므로 이렇게 인스턴스를 생성할 수 없다.
  
  return 0;   
}

정리
- main()함수가 호출되기전에 생성자가 호출될 수 있다.
- 생성자는 다중 정의할 수 있다.
- 소멸자는 다중 정의할 수 없다.
- main()함수가 끝난 후에 소멸자가 호출될 수 있다.
- 생성자와 소멸자는 생략할 수 있으나 생략할 경우 컴파일러가 만들어 넣는다.
 
 

C++ 개념 더보기

Visual Studio C++ 사전

c++ 공부 내용을 지속해서 추가하는 게시글입니다. 참고 책 Part1. C에서 C++로 문법 전환하기 Chap1. C와는 다른 C++ [C++] Hello world 출력해보기 [C++] 여러 변수 출력하기 [C++] Visual Studio 에서 추가로 사용

genius-duck-coding-story.tistory.com

 
 
 

'◼️C++' 카테고리의 다른 글

[C++] 참조형식 멤버변수 초기화 (생성자초기화목록 이용)  (0) 2023.09.17
[C++] 동적 객체의 생성과 소멸  (0) 2023.09.17
[C++] 클래스 접근 제어 지시자  (0) 2023.09.17
[C++] 클래스 기본 문법  (0) 2023.09.17
[C++] 객체지향 프로그래밍 개요  (0) 2023.09.17

    티스토리툴바