[C/C++] delete, default

그림자왕국·2020년 10월 26일
1

C++

목록 보기
8/24
post-thumbnail

delete

delte 키워드는 대입 연산자와 함께 사용하여 클래스에서 컴파일러가 default로 생성하는

함수(기본 생성자, 기본 대입 연산자 등)를 생성하지 못하게 막고 싶을 때 사용된다.

Cat() = delete; // 생성자 사용 불가 (객체 자체를 사용 불가)

Cat & operator=(Cat & other) = delete; // 대입연산자 사용 불가

Cat(const Cat & other) = delete; // 복사생성자 사용 불가

위와 같이 특정 기능을 사용하지 않게 하려고 할 때 delete 키워드를 사용할 수 있다.

또한 delete는 생성자나 연산자 뿐만 아니라 일반 멤버 함수에도 사용할 수 있기에

이를 응용하여 특정 자료형에 대한 오버로딩 및 암시적 형변환이 일어나는 것을 막을 수 있습니다.

{

// 아래와 같이 함수를 작성하는 경우 인수를 int형으로 암시적 형변환하여 실행하는 것을 막아줍니다.

// 예를들어 foo(12)을 호출하는 경우와 같은 암시적으로 int 자료형을 넘겨주는 것에 대해 에러가 발생합니다.

    void foo(double dparam);

    void foo(int iparam) = delete; // 암시적 형번환으로 int형이 인수로 들어와도 에러 발생
}

default

default 키워드는 클래스 기본 함수들을 명시적으로 나타내고 싶을 때 사용한다.

class Cat {
	Cat(int a, int b) {}
};

위와 같이 기본 생성자가 없을 경우 "Cat a;" 와 같은 기본 객체를 만들 때 컴파일 에러가 나타난다. 모두가 알다시피, 위의 기본 함수들 중 생성자와 소멸자에 대해서는 중요한 규칙이 있습니다. 

어떤 종류의 생성자건, 사용자가 직접 정의한 생성자가 존재한다면, 컴파일러는 기본 생성자를 만들어주지 않기 때문이다.

위와 같은 경우에 default 키워드를 사용하여 명시적으로 생성자를 만들 것을 요구할 수 있다.

 ''' { 
 	Cat() = default;
 };

그래서 위와 같이 기본 생성자에 default 키워드를 붙여주면 명시적으로 기본 생성자를 지정할 수 있으므로 따로 기본 생성자를 정의해주지 않아도 컴파일 에러가 일어나지 않고 개발자 역시 명시적으로 기본 생성자를 확인 가능하다.

하지만 default 키워드를 사용할 경우 멤버 변수가 초기화 되지 않아 default 키워드로 생성자가 호출된 객체를 인자 등으로 넘겨줄 땐 초기화 되지 않았다고 컴파일 에러가 일어날 수 있다.

 ''' {
    int num; // default 키워드를 사용할 경우 num이 초기화 되지 않음!
 	Cat() = default;
 };


 Cat a; // default 키워드로 객체 생성
 Func(a); // num이 초기화되지 않은 상태의 객체를 인수로 넘겨받으니 에러 발생!
profile
언리얼 엔진 매니아입니다.

0개의 댓글