본문 바로가기

Programming

이펙티브 모던 C++_3

[Effective Modern C++] 2015 스콧 마이어스 저
" C++11 과 C++ 14 를 효과적으로 사용하는 42가지 방법

 

 

항목 11. 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라

ex) int Secret() = delete;

-어떤 방법으로도 사용할 수 없다.

-멤버 함수나 friend 함수에서 복사하려 하면 컴파일이 실패한다.

-주로 public 에 선언한다.

** 원치 않은 사용은 원천 봉쇄한다.

 

 

 

 

항목 12. 재정의 함수들을 override로 선언하라

- override를 사용하지 않으면 부모 클래스의 함수 재정의를 시도할 때 

*기반 클래스 함수가 반드시 가상 함수

*기반 함수와 파생 함수의 이름이 반드시 동일

*기반 함수와 파생 함수의 매개변수 형식이 동일

*기반 함수와 파생 함수 const가 반드시 동일

*기반 함수와 파생 함수의 반환, 예외 명세가 반드시 호환

에 대하여 컴파일러가 경고하지 않는다.

*좌측 값 참조 (메모리 새로 할당-> 복사-> 기존 해제)
*우측 값 참조 (메모리 상의 이동(move))
DataType& data() & {return values;} // 복사 생성
DataType& data() && {return values;} // 이동 생성
-> 맴버 함수 참조 한정사를 이용하면 멤버 함수가 호출되는 객체의 좌측 값, 우측 값 버전을 다른 방식으로 처리할 수 있다.

 

 

 

 

항목 13. iterator 보다 const_iterator를 선호하라

c++11에서 cbegin(), cend() /*C++14 */ insert(), end() 함수는 const_iterator를 반환한다.

 

 

 

 

항목 14. 예외를 방출하지 않을 함수는 noexcept로 선언하라

throw의 경우 예외를 정의하고 해당 되지 않는 정의일 경우 std::unexpected -> std::terminated가 호출되어 조용히 종료되는 문제가 생긴다.

C++11부터 throw가 deprecated 되고 noexcept 키워드가 추가됨
noexcept 키워드를 추가하면 컴파일러에게 이 함수는  throw하지 않는 것을 보장하게 된다.
-예외 던지기에 따른 스택을 확보할 필요가 없어진다.
-예외 던지지 않는다는 강한 예외 안전성을 부여한다.
* 컴파일러는 std::vector::push_back의 경우 noexecpt로 선언되어 있을 경우 복사 연산을 이동 연산으로 대체한다. 

 

 

 

항목 15. 가능하면 항상 constexpr을 허용하라

constexpr :

1. 컴파일 때 값이 초기화되는 상수  

2. 컴파일 시점 인수로 호출되면 컴파일 시점 산수를 리턴

3. 실행 시점 호출하는 경우에는 실행 시점 값 리턴한다.(보통 함수처럼 사용)

 

*함수 안에서의 constexpr 

- 실행 가능한 문장은 많아야 하나이다.

- 보통은 return이나 삼항 연산자

 

 

 

항목 16. const 멤버 함수를 스레드에 안전하게 작성하라

- 멀티 스레드에서 const 수정이 필요한 경우 mutable, const 로 선언된 함수의 경우 여러 쓰레드에서 동시 접근하더라도 수행된다. (이런 경우는 const를 안 쓰는 것이 좋을 것 같다.)

 

 

 

 

항목 17 특수 멤버 함수들의 자동 작성 조건을 숙지하라

1. 특수 멤버 함수들은 프로그래머가 명시적으로 선언하지 않는 이상 자동으로 작성된다.

2. 이동 생성자를 추가하면 이동 배정은 자동으로 생성되지 않는다.

3. 복사 생성자를 하나만 만들어도 이동 연산자들은 자동 생성되지 않는다.

4. 이동 연산자를 하나만 만들어도 복사 연산자가 생성되지 않는다.

ex)

Widget(Widget&& rhs) // 이동 연산자

Widget& operator=(Widget&& rhs) // 이동 배정 연산자

 

3의 법칙
복사 생성자, 복사 배정 생성자, 소멸자 중 하나라도 선언했다면 나머지 둘도 선언해야 한다.
-> 멤버 함수와 연관된 연산들이기 때문
-> 자원 관리 차원
-> 선언해서 사용했다면 나머지도 신경을 써야 한다.

 

'Programming' 카테고리의 다른 글

이펙티브 모던 C++_5  (0) 2020.11.29
이펙티브 모던 C++_4  (0) 2020.11.22
이펙티브 모던 C++_2  (0) 2020.11.08
이펙티브 모던 C++_1  (0) 2020.11.01
윈도우 시스템 프로그래밍_8  (0) 2020.10.25