Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

Effective C++ Chapter 1 Summary

7 vues

Publié le

Effective C++ Chapter 1 Summary

Publié dans : Ingénierie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Effective C++ Chapter 1 Summary

  1. 1. Choi Seung Yeon Chapter 1
  2. 2.  Item 1  Item 2  Item 3  Item 4
  3. 3. Item 1 : C++은 언어들의 연합체! 1. C (절차지향) : C를 기본적으로 제공 2. C++ (객체지향) : 클래스, 캡슐화, 상속, 다형성, 가상함수(동적 바인딩) 3. Template C++ : Template Metaprogramming이란 새로운 패러다임. 4. STL : 자료구조와 알고리즘 등이 얽힌 Template Library C++ 프로그래밍의 핵심은 C++의 어떤 부분을 사용하느냐 이다.
  4. 4. Item 2 : #define 남발은 금물! [ 매크로대신 상수를 쓰자. ] #define ASPECT_RATIO 1.653 보다는 const double AspectRatio = 1.653; 을 쓰자. 컴파일러는 #define으로 정의한 값을 기계적으로 정의한 값으로 치환한 후 컴 파일을 시작한다. 따라서 다음과 같은 문제가 있다. - 디버깅 중에 ASPECT_RATIO가 어떤 값인지 알 수 없다. - 등장 횟수만큼 목적 코드안에 들어가므로 코드 크기가 커진다.
  5. 5. Item 2 : #define 남발은 금물! [ 클래스 상수(클래스 멤버를 상수로 정의)는 static으로 정의한다! ] 만약 클래스 상수의 사본 개수가 한 개를 넘지 못하게 하고 싶다면 static 멤버로 만들어야 한다. 이 클래스 상수의 구현은 선언과 정의로 나뉜다. header에서 선언되고, source에서 정의된다. 하지만 사실은 정의를 하지 않고, header에서의 선언만으로 사용이 가능해야 하나 많은 컴파일러들이 이를 받아들이지 않는다. (VS 17은 된다) 그 경우에는 enum hack을 사용해서 문제를 해결할 수 있다. 이 enum hack의 장점은 상당히 많지만, 논외임으로 생략한다. 알고 싶으면 책 참고.
  6. 6. Item 2 : #define 남발은 금물! [ 클래스 상수(클래스 멤버를 상수로 정의)는 static으로 정의한다! ]
  7. 7. Item 2 : #define 남발은 금물! [ 매크로 함수는 Template 인라인 함수로! ] #define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b)) 매크로 함수는 전처리기의 기계적 치환때문에 문제를 많이 일으킨다. 따라서, 매크로 함수의 일반화 장점과 안정성까지 완벽히 취할 수 있는 템플릿 인라인 함수를 사용하면 좋다. template<typename T> inline void callWithMax(const T& a, const T& b) { f( a > b ? a : b); }
  8. 8. Item 3 : const를 사랑해라! [ const는 프로그램의 안정성을 높여준다 ] const를 사용해 많은 오류를 잡아낼 수 있다. [ 포인터 const 규칙 ] const가 * 왼편에 있으면 포인터가 가리키는 대상이 상수이지만, 그 반대는 포인터 자체가 상수이다.
  9. 9. Item 3 : const를 사랑해라! [ 함수에서의 const는 가장 강력하다 ] 애초에 함수 반환 값을 const로 설정하면, 안정성이나 효율을 포기하지 않고도 예기치 못한 버그 를 방지할 수 있다. 만약 const가 없었다면, a*b의 결과로 나오는 임시객체에 c를 대입하는 경우가 발생한다.
  10. 10. Item 3 : const를 사랑해라! [ 상수 멤버 함수 ] 상수 객체에 대해 호출될 함수이다. 이 함수는 2가지 중요점을 가진다. - 인터페이스를 보기 좋게 만든다. 즉, 변경할 수 없는 함수가 어떤 것인지 알려준다. - 상수 객체를 사용할 수 있다. Reference-to-const가 가능하여 성능을 높인다. (const T&) 가지는 특징은 다음과 같다. - Reference-to-const에서 호출이 가능하다. - 상수 멤버 함수이냐 아니냐로 오버로딩이 가능하다. - 멤버 변수의 값을 바꾸지 않는다.
  11. 11. Item 3 : const를 사랑해라! [ 상수성 ] - 비트수준(물리적) 상수성 어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 수정하지 않아야만, const임을 인정한다. 즉, 그 객체를 구성하는 비트들 중 어떤 것도 바꾸면 안된다. - 논리적 상수성 값이 바뀌어도 그것을 사용자가 알 수 없으며, 논리적으로 옳다면 const임을 인정한다. mutable 키워드로 상수 객체에서도 수정가능한 멤버를 생성할 수 있다.
  12. 12. Item 4 : 객체는 반드시 초기화부터! [ 정의되지 않은 동작 ] 초기화 되지 않은 변수는 정의되지 않은 동작을 발생시킨다. 따라서 무조건 초기화부터! [ class 생성자 : 대입과 초기화를 구별하자 ] 많은 개발자들이 생성자에서 대입을 하는 경우가 많다. 이는 개운한 방법이 아니다. 초기화되고 있는 것이 아니라, 대입되고 있는 것이다. 따라서, Member Initializer를 이용하여 초기화하는 것이 좋다. 만약 기본 생성자로 초기화 하고 싶은 경우에도, Member Initializer를 이용하도록 하자!
  13. 13. Item 4 : 객체는 반드시 초기화부터! [ 초기화는 base class 부터 ] 초기화 순서는 다음과 같다. 1. Base class 초기화 2. Class member value 초기화 : 변수가 선언된 순서대로 Member Initializer의 순서는 영향이 없다.
  14. 14. Item 4 : 객체는 반드시 초기화부터! [ 비 지역 정적 객체 ] Static 객체 란 자신이 생성된 시점부터 프로그램이 끝날 때까지 살아 있는 객체이다. 즉, 스택 객체 및 힙 기반 객체는 애초에 Static 객체가 될 수 없다. 그 종류는 다음과 같다. - 전역객체 - 네임스페이스 내의 전역 객체 - 클래스 안 static 객체 - 함수 안 static 객체 ( 함수에 대해 지역성을 가지므로, 이 객체만 지역 정적 객체이다 ) - 파일 유효범위 안 static 객체
  15. 15. Item 4 : 객체는 반드시 초기화부터! [ 비 지역 정적 객체 ] 문제는 서로 다른 번역 단위에 정의된 비 지역 정적 객체들 사이의 상대적인 초기화 순서는 정해져 있지 않다는 것이다. 이 문제는 싱글톤 패턴으로 해결할 수 있다. 비 지역 정적 객체를 하나씩 맡는 함수를 준비하고, 이 안에 객체를 넣는 것이다. 함수 속에서도 이들은 정적 객체로 선언하고, 그 함수에서는 이들에 대한 참조자를 반환한다. 즉, 비 지역 정적객체를 직접 참조하는 것이 아닌 함수 호출(지역 정적 객체)로 대신하는 것이다.

×