개발하는 리프터 꽃게맨입니다.

[C++] 클래스가 암시적으로 정의하는 함수들 본문

언어/C, C++

[C++] 클래스가 암시적으로 정의하는 함수들

파워꽃게맨 2024. 1. 6. 19:29

클래스를 기본적으로 정의하면

암시적으로 생성되는 함수들이 있습니다.

 

1) 기본 생성자

2) 기본 소멸자

3) 기본 복사 생성자

4) 기본 대입 연산자

 

class Object
{
//이 아래 코드는 굳이 명시하지 않아도
//기본적으로 컴파일러가 만들어준다.

public:
	//기본 생성자
	Object() {}
	
	//기본 소멸자
	~Object() {}

	//기본 복사 생성자
	Object(const Object& other)
		: a(other.a)
		, b(other.b)
	{}

	//기본 대입 연산자
	Object& operator=(const Object& other)
	{
    	if(this != &other)
        {
			Object newObject;
			newObject.a = other.a;
			newObject.b = other.b;
			return newObject;
        }
        
        return *this;
	}

private:
	int a;
	int b;
};

 

경우에 따라 우리는 기본적으로 정의되는 함수들을 의도적으로 막고 싶을 경우가 있습니다.

public:
	//기본 생성자
	Object() = delete;
	
	//기본 소멸자
	~Object() {};

	//기본 복사 생성자
	Object(const Object& other) = delete;

	//기본 대입 연산자
	Object operator=(const Object& other) = delete;
private:
	int a;
	int b;
};

 

그럴 때는 이렇게 명시적인 함수의 원형을 선언한 다음에

정의 없이 = delete를 사용하면 사용을 아예 막을 수 있습니다.

 

예전에는 접근 지정자를 private로 돌리는 방법을 사용했는데,

새로운 표준 문법에서는 이런 문법도 지원합니다.

 

단, 소멸자의 삭제는 상당히 신중하게 해야합니다.

소멸자를 삭제하면 해당 타입의 객체를 소멸할 방법이 없으므로 지역 변수로 해당 객체를 사용할 수 없으며,

동적 할당을 할 시에는 프로그램이 끝날 때까지 해당 메모리를 해제할 수 없습니다.