Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

codingfarm

함수 삭제(deleted function) 본문

Programming Language/C++

함수 삭제(deleted function)

scarecrow1992 2021. 2. 28. 01:13

progtrend.blogspot.com/2017/03/deleted-functions.html

 

C++ deleted functions (함수의 삭제 선언)

C++ deleted functions.

progtrend.blogspot.com

 

어떤 함수를 삭제하면 그 함수에 대한 어떠한 호출도 불가능해진다.

C++ 11이전에서는 그런 메서드를 private로 선언하여 사용을 막았으나,

C++ 11부터는 함수 삭제 기능을 지원한다.

그렇다면 함수를 처음부터 안만들면 되는것 아닐까?

문제는 컴파일러가 자동으로 만드는 함수들에 있다.

C++ 컴파일러는 클래스의 생성자, 파괴자, 대입연산자를 자동으로 생성한다.

이때, 그런 함수들을 일정 사용하지 못하게끔 하기 위해서 함수를 delete 시킨다.

1
2
3
4
5
6
7
class NoCopyClass {
public:
    ...
    NoCopyClass(const NoCopyClass&= delete;
    NoCopyClass& operator=(const NoCopyClass&= delete;
    ...
};
cs

위 코드는 복사생성자와 대입연산자를 삭제함으로써 객체를 복사할 수 없게끔 한다.

 

삭제함수의 선언은 public으로 선언하는것이 관례이다. 왜냐하면 컴파일러가 함수의 삭제여부 이전에 private여부를 먼저 판단하기 때문에 삭제된 함수에 대한 정확한 메시지를 출력하도록 유도하려면 public으로 선언해야하기 때문이다.

 

함수 삭제의 장점

 함수 삭제가 private 선언보다 좋은 점은 몇가지 있다.

1. 클래스의 메서드 외에 모든 함수가 삭제 가능하다.

이러한 점을 이용해서 "함수 인자의 암묵적인 변환을 이용한 호출"을 막을 수도 있다

1
2
3
4
5
6
7
8
9
bool isLucky(int number);
bool isLucky(double= delete;
 
if (isLucky(7)) // 호출 가능
    ...
if (isLucky('a')) // 호출 가능
    ...
if (isLucky(3.5)) // 호출 불가능. 에러!
    ...
cs

isLucky 함수의 매개변수가 double인 경우를 삭제함으로써 암묵적인 형변환을 미리 차단하였다.

 

또한 템플릿의 특정 특수화(specialization) 버전을 삭제함으로 써 그 함수가 생성되는것을 막을 수 있다.

1
2
3
4
5
template<typename T>
void processPointer(T* ptr);
 
template<>
void processPointer<void>(void*= delete// void 포인터는 호출 불가!
cs

 void 타입의 특수화 함수를 선언하고 삭제함으로써 그런 함수가 생성되는 걸 막고 당연히 호출도 불가하게 만드는 것이다.

 

2. 코드의 의도를 분명히 할 수 있다.

특정 메소드를 사용하지 못하게 하려고 private의 선언하는 것보다 delete로 선언하는 게 더 분명하게 의도를 전달할 것이고 그런 코드를 읽게 된다면 무엇을 의도하고 함수를 삭제했는지 파악하는 것도 private으로 선언하는 것보다 훨씬 쉬울 것이다. 코드를 읽기 쉽게, 의도를 분명하게 작성하는 건 기본 중의 기본이고 항상 바람직한 일이다.

 

 

 

 

 

 

 

'Programming Language > C++' 카테고리의 다른 글

friend  (0) 2021.04.15
enum과 enum class  (0) 2021.04.15
explicit  (0) 2021.04.15
인스턴스의 생명주기  (0) 2021.03.19
#pragma 사용법  (0) 2020.11.20
Comments