본문 바로가기

PROGRAMMING26

12. 재정의 함수들을 override로 선언하라. - 재정의 함수는 override로 선언하라. 재정의가 일어나려면 다음과 같은 여러 필수 조건을 만족해야 한다. 1. 기반 클래스 함수가 반드시 가상 함수이어야 한다. 2. 기반 함수와 파생 함수의 이름이 반드시 동일해야 한다.(소멸자 제외) 3. 기반 함수와 파생 함수의 매개 변수 타입들이 반드시 동일해야 한다. 4. 기반 함수와 파생 함수의 const 성이 반드시 동일해야 한다. 5. 기반 함수와 파생 함수의 반환 타입과 예외 지정이 반드시 호환되어야 한다. 6. 멤버 함수들의 참조 한정자들이 반드시 동일해야 한다. 이러한 모든 재정의 요구조건들이 뜻하는 것은 작은 실수가 큰 차이를 빚을 수 있다는 것이다. 재정의 실수가 포함된 코드는 프로그래머가 의도한 것과 다르게 행동하기 마련이지만, 그래도 여전.. 2020. 12. 26.
11. 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라. - 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라. C++98에서는 어떤 함수의 사용을 막고 싶으면, 그 함수를 private로 선언하고 함수의 정의를 만들지 않는 방법을 사용하였다. C++11에서는 같은 목적을 달성하는 더 나은 방법이 있다. 바로 사용을 막을 함수 선언의 끝에 "=delete"를 붙이는 것이다. =delete를 붙인 함수를 삭제된 함수(delete function)라고 부른다. 사용을 막아둔 함수를 사용하려고 했을 경우, C++98은 링크 시점에 가서야 발견하지만, C++11의 삭제된 함수는 컴파일 시점에 발견될 수 있다. C++11의 삭제된 함수는 private가 아니라 public으로 선언하는 것이 관례이다. 여기에는 이유가 있다. 클라이언트 코드가 멤버 함수를 사용하려 할.. 2020. 12. 25.
10.범위 없는 enum보다 범위 있는 enum을 선호하라. - C++98 스타일의 enum을 이제는 범위없는 enum이라고 부른다. C++98 스타일의 enum으로 선언된 열거자(enumerator)들에 대해서는 "한 중괄호 쌍 안에서 어떤 이름을 선언하면 그 이름의 가시성은 해당 중괄호 쌍이 정의하는 범위로 한정된다"는 일반적인 규칙이 적용되지 않는다. 그런 열거자 이름들은 enum을 포함하는 범위에 속하며, 따라서 그 범위에 같은 이름이 있으면 안 된다.이러한 이유로 C++98 스타일의 enum을 범위 없는(unscoped) enum이라고 부른다. enum Color { black, white, red }; // black, white, red는 // Color가 속한 범위에 속함 auto white = false; // 오류! 이 범위에 이미 // whit.. 2020. 12. 25.
9. typedef 보다 별칭 선언을 선호하라. - typedef는 템플릿화를 지원하지 않지만, 별칭 선언은 지원한다. STL 컨테이너들을 사용하다 보면 다음과 같은 타입을 흔히 만난다. std::unique_ptr 이런 타입을 여러 번 입력하고 싶지는 않을 것이다. 그냥 생각만 해도 손목 터널 증후군에 걸릴 것 같다. 이럴 때 사용할 수 있는 것이 typedef 이다. typedef std::unique_ptr UPtrMapSS; 그런데 typedef는 너무 C++98스러운 유물이다. C++11에서도 typedef가 작동하지만, C++11은 별칭 선언(alias declaration) 이라는 것도 제공한다. using UPtrMapSS = std::unique_ptr; typedef와 하는 일은 정확히 동일하다. 하지만 typedef보다 우월한 점이.. 2020. 12. 20.