본문 바로가기

전체 글50

14. 예외를 방출하지 않을 함수는 noexcept로 선언하라. - noexpcet는 함수의 인터페이스의 일부이다. 이는 호출자가 noexcept 여부에 의존할 수 있음을 뜻한다. C++98에서 예외 지정은 다소 변덕 스러운 야수였다. 함수 구현이 바뀌면 예외 지정도 바뀔 가능성이 생겼고, 기존의 예외 지정에 의존하던 클라이언트 코드는 깨질 수 있었다. 게다가, 대체로 컴파일러는 함수구현과 게다가, 대체로 컴파일러는 함수 구현과 예외 지정, 그리고 클라이언트 코드 사이의 일관성 유지에 아무런 도움도 주지 않았다. 그래서 대부분의 프로그래머는 결국 C++98의 예외 지정이 득보다 실이 크다고 판단하게 되었다. C++11 제정 과정에서, 함수의 예외 방출 행동에 관해 정말로 의미 있는 정보는 함수가 예외를 하나라도 던질 수 있는지 아니면 절대로 던지지 않는지의 여부라는 .. 2020. 12. 27.
13. iterator보다 const_iterator를 선호하라. - itorator보다 const_iterator를 선호하라. 가능한 한 항상 const를 사용하는 것이 좋다. 하지만 프로그래머들은 가능한 한 항상 const를 사용하지 않는다. 실용적일 때에만 항상 사용할 뿐이다. 그리고 C++98에서 const_iterator는 그리 시용적이지 못하다. 왜냐하면 C++98에서는 비상수 컨테이너로부터 const_iterator를 얻는 방법도 까다로웠고, 삽입/삭제 위치를 iterator로만 지정할 수 있었기 때문이다. 하지만 C++11에서는 C++98에서의 문제점들이 개선되었다. 따라서 C++11 환경에서 프로그래밍을 한다면 가능한 한 iterator 보다 const_iterator를 사용하는 것이 좋다. 예를 들어 std::vector에서 1983이라는 값이 처음 .. 2020. 12. 26.
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.