본문 바로가기

2023 c++

23년 C++ chap7 클래스와 생성자 -> 생성자와 소멸자(선언,정의)

03 생성자와 소멸자

-인스턴스: 클래스 정의에 있는 데이터 멤버를 캡슐화한 객체

-캡슐화: 연관된 데이터와 함수를 논리적으로 묶어놓은 것

 

1 객체의 생성과 소멸

-객체는 생성자라는 특별한 멤버 함수가 호출될 때 생성됨

ㄴ객체가 데이터 멤버로 작업을 하려면 객체를 만든 뒤 데이터 멤버를 초기화해야 함

ㄴ따라서 생성자 내부에서 초기화하면 편리하다

 

-소멸자라는 특별한 멤버 함수가 호출되면 소멸자 내부에서 객체를 정리함

ㄴ객체가 더이상 필요 없어지면 객체가 차지하는 메모리를 비워줘야 함

 

객체의 라이프사이클

 

 

2 생성자 -> 객체를 생성!!하는 멤버함수

-클래스 정의에서 데이터 멤버 선언한다고 데이터 멤버가 초기화되진 않는다(멤버의 이름,자료형만 지정한다)

ㄴ그래서 생성자 내부에서 객체의 데이터 멤버를 초기화한다

 

-생성자의 3가지 특징

ㄴ특징1: 리턴값이 없다

ㄴ특징2: 이름이 클래스의 이름과 같다

ㄴ특징3: const한정자 붙일 수 없다

 

-생성자 종류(3가지)

ㄴ매개변수가 있는 생성자

ㄴ기본 생성자

ㄴ복사 생성자

 

(1) 생성자 선언

-생성자는 클래스의 멤버 함수이므로 클래스 정의에서 선언해야 함

-데이터 멤버 초기화(변경 작업)하므로 const 한정자 붙일 수 x

class Circle{
	public:
		Circle(double radius);        // 매개변수가 있는 생성자
		Circle();                     // 기본 생성자
		Circle(const Circle& circle); // 복사 생성자
		...
}

-> 1 매개변수 있는 생성자

ㄴ데이터 멤버를 초기화하기 위해 사용

ㄴ오버로드 가능

-> 2 기본 생성자(매개변수 없는 생성자)

ㄴ모든 데이터 멤버를 리터럴 값으로 초기화할 때 사용

ㄴ오버로드 불가

-> 3 복사 생성자

ㄴ데이터 멤버를 이전의 다른 객체와 동일 값으로 초기화할 때 사용

ㄴ복사 생성자로 객체 복사를 하면, 원본과 사본이 같은 값을 갖는 다른 객체로 만들어짐

ㄴ매개변수로 자신과 같은 객체의 참조를 하나 받음

ㄴ매개변수 앞에 const 한정자 붙임(원본 객체를 변경하지 못하게)

 

(2) 생성자 정의

//매개변수 있는 생성자의 정의
Circle::Circle(double rds)
: radius(rds)
{
	//문장
}
//기본 생성자의 정의
Circle::Circle()
: radius(1.0)   //초기화 리스트(생략하면 데이터 멤버에 쓰레기 값이 들어감)
{
	//문장
}
//복사 생성자의 정의
Circle::Circle(const Circle& cr)
: radius(cr.radius)   //초기화 리스트
{
	//문장
}

 ㄴ> 생성자 정의는 함수 헤더 뒤에 초기화 리스트 문법(:)을 사용하여 데이터 멤버를 초기화한다

: 데이터_멤버(매개변수), ..., 데이터_멤버(매개변수)

 ㄴ> 여러 개의 데이터 멤버 초기화할 때, 초기화 리스트 문법

  - 초기화 리스트의 각 항목은 데이터 멤버 = 매개변수 와 같은 할당문

  - 초기화 목록 뒤에는 세미콜론 붙이지 않고 바로 함수 본문을 입력

  - 데이터_멤버의 이름은 클래스 정의에서 데이터 멤버에 선언한 이름과 같아야 함

  - 매개변수의 이름은 알아서 지으면 됨

  - 생성자의 초기화 리스트에서는 상수 데이터의 값을 변경할 수 있다 -> 상수 데이터도 초기화해야 함

 

 

3 소멸자 -> 객체를 완전히 제거!!하는 멤버함수

-소멸자의 4가지 특징

ㄴ특징1: 소멸자 이름은 클래스 이름 앞에 물결 기호(~)가 붙은 형태

ㄴ특징2: 리턴값이 없다

ㄴ특징3: 객체가 스코프를 벗어나는 등의 상황에 자동 호출

ㄴ특징4: 오버로드할 수 없다(매개변수가 없으므로)

 

(1) 소멸자 선언

class Circle{
	...
	public:
		...
		~Circle();
}

(3) 소멸자 정의

-다른 멤버함수처럼 정의하되, 이름 앞에 물결 기호(~)가 있다는 특징에 주의

-소멸자는 public을 적용한다

//소멸자 정의
Circle::~Circle()
{
	//문장
}