본문 바로가기

프로그래밍/Modern C++

[C++] private 함수보다는 delete 를 사용하자

 

 

개요

 다른 개발자가에게 제공할 코드를 작성할 때, 그 개발자가 코드의 특정 함수를 호출하지 못하게 하는 가장 흔한 방법은

그냥 그 함수를 선언하지 않는 것이다. 그러나 C++ 이 대신 함수들을 선언하는 경우가 있으며(생성자, 소멸자, 복사 생성자, 복사 대입 연산자, 이동 생성자, 이동 대입 연산자) 그런 경우 클라이언트가 그 함수들을 호출하지 못하게 하기는 그리 쉽지 않다.

 

C++98에서는, 사용을 금지하려는 멤버 함수가 있을 경우 Private으로 선언하고 정의하지 않는 것이었다. C++11에서는 같은 목적을 달성하는 더 나은 방법이 있다. 바로 생성자에 "=delete"를 붙이는 것이다. =delete를 붙인 함수를 삭제된 함수(Deleted Function)이라고 부른다. (Effective Modern C++)

 

Private을 이용한 디폴트 함수 방지

캐릭터를 만든다고 해보자 캐릭터는 x, y의 좌표값을 가지고 있고 기본 생성자와 복사 생성자를 Private 키워드 밑에 함수를 작성해서 만들지 못하도록 하였다. 이러한 방법의 단점은 이러한 방법은 멤버 함수에서만 사용할 수 있다는 단점이 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Character {
private:
    int x_, y_;
    Character();
    Character(const Character&);
public:
    Character(const int x, const int y) :x_(x), y_(y) {}
};
 
 
int main() {
 
    Character ch1(56);
    //기본 생성자가 Private에 있기 때문에 오류발생
    Character ch2;
    //복사 생성자가 Private에 있기 때문에 오류발생
    Character ch3 = ch1;
}
 

 

Delete을 이용한 디폴트 함수 방지

char 자료형을 받고 싶은 word라는 함수가 있다고 해보자 C에서 물려받은 유산으로 인해 수치로 간주될 여지가 조금이라도 있는 형식은 암묵적으로 int로 변한다고 한다. 

그러면 어떻게 해야 할까 멤버 함수도 아니기 때문에 Private 키워드를 사용할 수 없다. 이럴 때 사용하는 게 delete 키워드이다. 생성을 원하지 않는 함수에 delete를 사용해서 원하지 않는 결과를 방지할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
void Word(int= delete;
void Word(double= delete;
void Word(char word) {}
 
int main() {
    // 자료형을 배제 했기 때문에 오류가 발생한다.
    Word(1);
    // 자료형을 배제 했기 때문에 오류가 발생한다.
    Word(1.5);
 
    Word('C');
}

 

 

출처 및 레퍼런스

출처: Effective Modern C++ (인사이트)