C & C++/C++

[C++] Constructor(생성자)와 Destructor(소멸자)

  • -
728x90

멤버변수의 초기화

클래스를 가지고 객체를 생성하면, 해당 객체는 메모리에 즉시 생성된다. 하지만 이 객체는 모든 멤버 변수를 초기화 하기 전에는 사용할 수 없다.

 

객체의 멤버 변수는 사용자나 프로그램이 일반적인 초기화 방식으로 초기화할 수 없다. 만약 pirvate 멤버를 가지고있으면 직접 접근할 수 없기 때문이다.

 

따라서 private 멤버에 접근할 수 있는, 초기화만을 위한 public 함수가 필요하다.

 

Counstructor(생성자)

C++에서는 객체의 생성과 동시에 멤버 변수를 초기화해주는 생성자를 제공한다. 생성자의 이름은 해당 클래스의 이름과 같다.

클래스이름();

 

  • 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
  • 생성자는 반환값이 없지만, void형으로 선언하지 않는다.
  • 객체를 초기화하는 방법이 여러 개 존재할 경우 오버로딩 규칙에 따라 여러 개의 생성자를 가질 수 있다.

 

Default constructor(디폴트 생성자)

디폴트 생성자는 객체가 생성될 때 사용자가 초깃값을 명시하지 않으면, 컴파일러가 자동으로 제공하는 생성자이다.

디폴트 생성자는 사용자로부터 인수를 전달받지 않으므로, 매개변수를 가지지 않는다.

 

 

Copy constructor(복사 생성자)

Shallow copy(얕은 복사)와 Deep copy(깊은 복사)

얕은 복사는 디폴트 복사 생성자에 의한 멤버 대 멤버의 복사 방식을 말한다. 하지만 멤버 변수가 힙의 메모리 공간을 참조하는 경우에 문제가 된다.

A a("c", 1);
A b = a;

b는 a의 디폴트 복사생성자에 의해 멤버 대 멤버 복사가 일어났다. 이를 얕은복사라고 한다.

a의 멤버변수를 가리키는 주소값을 b의 멤버변수도 같이 할당 받는다.

만약 A의 멤버변수가 동적할당의 의해 생성되었고 a의 멤버변수를 먼저 해제해준다면, b는 이미 소멸된 멤버변수를 대상으로 해제하기때문에 문제가 발생한다.

 

이 문제를 해결하기위해 깊은복사를 사용한다.

 

C++에서 복사 생성자란 자신과 같은 클래스 타입의 다른 객체에 대한 참조(reference)를 인수로 전달받아, 그 참조를 가지고 자신을 초기화 하는 방법이다.

복사 생성자를 이용한 대입은 깊은복사이기 때문에 새롭게 생성되는 객체가 원본 객체와 같으면서도, 완전한 독립성을 가지게 해준다.

클레스이름::클레스이름(const 클레스이름& 이름)
{
	...
}

 

const로 인자를 받아오는 이유는 기존의 객체의 멤버 변수 값을 건드리지 않겠다는 의미이다.

 

Destructor(소멸자)

C++에서 생성자는 객체 멤버의 초기화뿐만 아니라, 객체를 사용하기 위한 외부 환경까지도 초기화하는 역할을 한다.

따라서 객체의 수명이 끝나면 생성자의 반대 역할을 수행할 멤버 함수도 필요해진다. 이러한 역할을 하는 멤버 함수를 소멸자라고 한다.

소멸자는 객체의 수명이 끝나면 컴파일러에 의해 자동으로 호출되며, 사용이 끝난 객체를 정리해 준다.

 

소멸자의 이름은 클레스의 이름과 같으며 ~를 붙여 생성자와 구분한다.

  • 소멸자는 인수를 가지지 않는다
  • 소멸자는 반환값이 없지만, void형으로 선언하지 않는다
  • 객체는 여러 개의 생성자를 가질 수 있지만, 소멸자는 단 하나만 가질 수 있다.
  • 소멸자는 const, volatile, static으로 선언될 수 없지만, const, volatile, static으로 선언된 객체의 소멸을 위해서 호출될 수 있다.
728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.