목록Tutorials/C++ : Advanced (99)
KoreanFoodie's Study
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 9 : 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 핵심 : 생성자 및 소멸자 안에서 가상 함수를 호출하지 말자! 가상 함수라고 해도, 지금 실행 중인 생성자나 소멸자에 해당되는 클래스의 파생 클래스 쪽으로는 내려가지 않는다! 객체 생성 및 소멸 과정 중에는 가상 함수를 호출하면 절대로 안 된다! 예시를 보자. // 모든 거래에 대한 기본 클래스 class Transaction { public: Transaction(); // 타입에 따라 달라지는 로그 기록을 만든다 virtual void logTransactio..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 8 : 예외가 소멸자를 떠나지 못하도록 붙들어 놓자 핵심 : 1. 소멸자에서는 예외가 빠져나가면 안 된다. 만약 소멸자 안에서 호출된 함수가 예외를 던질 가능성이 있다면, 어떤 예외이든지 소멸자에서 모두 받아낸 후에 삼켜 버리든지 프로그램을 끝내든지 해야 한다. 2. 어떤 클래스의 연산이 진행되다가 던진 예외에 대해 사용자가 반응해야 할 필요가 있다면, 해당 연산을 제공하는 함수는 반드시 보통의 함수(즉, 소멸자가 아닌 함수) 이어야 한다. 다음과 같은 예시를 보자. class Widget { public: ... // 이 함수로부터 ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 7 : 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 핵심 : 1. 다형성을 가진 기본 클래스에는 반드시 가상 소멸자를 선언해야 한다. 즉, 어떤 클래스가 가상 함수를 하나라도 갖고 있으면, 이 클래스의 소멸자도 가상 소멸자이어야 한다. 2. 기본 클래스로 설계되지 않았거나 다형성을 갖도록 설계되지 않은 클래스에는 가상소멸자를 선언하지 말아야 한다. 다음과 같은 TimeKeeper 클래스를 만들고, 팩토리 메서드 패턴으로 파생 클래스의 타입에 맞는 객체를 리턴한다고 가정하자. class TimeKeeper { ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 6 : 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 핵심 : 컴파일러에서 자동으로 제공하는 기능을 허용치 않으려면, 대응되는 멤버 함수를 private 으로 선언한 후에 구현은 하지 않은 채로 두자. Uncopyable 과 비슷한 기본 클래스를 쓰는 것도 한 방법이다. 우리가 부동산을 판매하는 프로그램을 만들게 되었는데, 각 자산은 세상에서 하나밖에 없다는 것을 적용해 달라고 요청했다고 가정해 보자. 즉, 다음과 같은 코드는 컴파일이 되면 안된다는 뜻이다! class HomeForSale {...}; .....
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 5 : C++ 가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 핵심 : 컴파일러는 경우에 따라 클래스에 대해 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자를 암시적으로 만들어 놓을 수 있다 클래스를 만들 때, 컴파일러는 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자를 암시적으로 생성한다. 소멸자는 해당 클래스가 상속한 기본 클래스의 소멸자가 가상 소멸자로 되어 있지 않으면 역시 비가상 소멸자로 만들어진다(물론 사용자가 생성자를 선언하면 컴파일러가 기본 생성자를 만들지 않는다). 그렇다면 이러한 기본 생성자가 ..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 4 : 객체를 사용하기 전에 반드시 그 객체를 초기화하자 핵심 : 1. 기본제공 타입의 객체는 직접 손으로 초기화하자. 2. 생성자에서는, 생성자 본문 내무에 데이터 멤버에 대한 대입문을 넣지 않고 초기화 리스트를 사용하자. 또한 데이터 멤버가 선언된 순서와 똑같이 나열하자. 3. 여러 번역 단위에 있는 비지역 정적 객체들의 초기화 순서 문제는 피해서 설계해야 한다. 비지역 정적 객체를 지역 정적 객체로 바꾸면 된다. 생성자를 다음과 같이 쓰는 것은, 생성과 동시에 '초기화' 하는 것이 아닌, '대입'을 행하는 것이다. class Us..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 3 : 낌새만 보이면 const 를 들이대 보자! 핵심 : 1. const 를 붙여 선언하면 컴파일러가 사용상의 에러를 잡아내는 데 도움을 준다. const 는 어떤 유효범위에 있는 객체에도 붙을 수 있으며, 함수 매개변수 및 반환 타입에도 붙을 수 있으며, 멤버 함수에도 붙을 수 있다. 2. 컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 우리는 개념적인(논리적인) 상수성을 사용해서 프로그래밍해야 한다. 3. 상수 멤버 빛 비상수 멤버 함수가 기능적으로 서로 똑같게 구현되어 있을 경우에는 코드 중복을 피하는 것이 좋은데, 이때..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 2 : #define 을 쓰려거든 const, enum, inline 을 떠올리자 핵심 : 1. 단순한 상수를 쓸 때는, #define 보다 const 객체 혹은 enum 을 우선 생각하자. 2. 함수처럼 쓰이는 매크로를 만들려면, #define 매크로보다 인라인 함수를 우선 생각하자. 항목 2의 핵심은, 가급적 선행 처리자보다는 컴파일러와 친하게 지내는 게 좋다는 것이다. 다음과 같은 예를 보자. #define ASPECT_RATIO 1.653 위의 경우, 해당 부분을 디버깅할 때, ASPECT_RATIO 는 컴파일러가 쓰는 기호 테..
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다! 항목 1 : C++ 를 언어들의 연합체로 바라보는 안목은 필수 핵심 : 1. C++ 를 사용한 효과적인 프로그래밍 규칙은, C++ 의 어떤 부분을 사용하느냐에 따라 달라진다! C++ 을 이루고 있는 하위 요소 (Building Block) 은 크게 4 가지이다. C (C 에는 템플릿도 없고, 예외도 없고, 오버로딩도 없다) 객체 지향 개념의 C++ (클래스를 쓰는 C 에 관한 모든 것들. 캡슐화, 상속, 다형성, 가상함수 등) 템플릿 C++ (템플릿 메타 프로그래밍까지) STL (container, iterator, algorithm, fu..