C++/면접 대비

클래스의 3가지 생성자에 대해 설명해주시겠어요?

WhNi 2024. 3. 20. 15:40

클래스에는 3가지 생성자가 있습니다.

기본 생성자, 매개변수 생성자, 복사 생성자가 있습니다.

class의 기본 기능들이기 때문에, 명시적으로 구현하지 않으면 자동으로 생성됩니다.

 

#include <iostream>

using namespace std;

// 기본 생성자
class Class_name
{
public:
	Class_name()
	{
		cout << "Default constructor" << "\n";
	}
};

// 멤버 변수를 초기화 하는데 사용되는 생성자에 인수를 전달 할 수 있음 (매개변수 생성자) 
class Class_parameter
{
private:
	int x;
	int y;
public:
	Class_parameter(int _x, int _y)
	{
		x = _x;
		y = _y;
		cout << "parameterized Constructor" << "\n";
	}

};
// 복사 생성자 매개변수에 객체가 들어가며, 데이터 타입은 클래스 자체가 됨.
class Class_Copy
{
private:
	int x;
public:
	Class_Copy(Class_Copy& t)
	{
		x = t.x;
	}
};

여기서 복사 생성자에서는 중요한 개념이 있는데,

 

얕은 복사와 깊은 복사 입니다.

얕은 복사는 객체의 최상의 구조만 복제되고, 객체의 변수에 대해서는 새로운 메모리가 할당되지 않습니다. 그러므로 원본개체와 복사된 개체 전부 동적으로 할당된 동일한 주소를 공유하게됩니다. 한 개체의 변수에 변화가 생기면 다른 개체에도 영향을 미치기 때문에, 리소스 문제 혹은 의도하지 않은 문제가 발생할 수 있습니다.

 

그래서 깊은 복사는 얕은 복사와 다르게 할당된 리소스에 대해 새롭게 메모리 할당을 시키는 개념입니다. 그래서 각자 독립적인 복사본을 갖게되며, 각자의 개체에 영향을 주지 않습니다. 

 

즉, 클래스 단위 복사가 이뤄질때는 새로운 리소스에 대한 복사를 신중하게 고려해야하고, 수동적인 new 보다는 스마트 포인터 같이 가비지 콜렉터가 있는 기능을 쓰면 메모리 관리가 용이합니다.

 

추가적으로 소멸자도 존재합니다. 클래스에 대한 호출이 끝날때 자동으로 생성되며, 객체에 할당된 메모리를 전부 해제합니다.