헤더파일
- #define 가드 : 여러 번 포함되지 않기 위해 #define 가드를 사용. 기호의 포맷은
<PROJECT><PATH><FILE>H 으로 한다.
//foo/src/bar/baz.h 파일인 경우
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
...
#endif //FOO_BAR_BAZ_H_
- include의 이름과 순서 : 프로젝트의 소스 디렉터리의 하위 요소로 나열
//google-awesome-project/src/base/logging.h 파일인 경우
#include "base/logging.h"
범위
- 지역 변수 : 함수의 변수는 가능한 좁은 범위에 두고, 선언 시 초기화해라
- 클래스 타입의 정적 변수와 전역 변수를 금지한다. 전역 변수는 꼭 필요한 경우가 아니면 피해라
클래스
- 생성자에서의 작업: initializer list를 활용
Thing (int foo, int bar) : foo_(foo), bar_(bar) { }
- 사용자 정의 소멸자, 사용자 정의 복사 생성자, 사용자 정의 대입 연산자 중 하나가 필요하다면 셋 모두를 작성하라. (Rule of Three)
class Student{
public:
Student(const int id, const StudentYear year) : id_(id), year_(year) {}
Student(const Student& student) : id_(student.id), year_(student.year) {} //복사 생성자
Student& operator=(const Student& student) { //대입 연산자
if(this != &student) { *this = Student(student); }
return *this;
}
~Student(); //소멸자
private:
const int id_;
StudentYear year;
}
- 선언 순서: public: protected: private: 순으로 선언되고 메서드가 멤버변수 보다 먼저 선언된다.
- 짧은 함수: 가능한 40라인 이내의 짧고 집중된 함수를 작성하라.
그 외의 기능들
- 레퍼런스 인자: 레퍼런스로 전달되는 모든 인자는 const로 수식. 컨테이너(데이터를 저장하고 관리하기 위한 클래스 vector, list, map, deque 등..)를 인자로 사용할 경우 레퍼런스 사용을 선호하라
void Foo(const string &in, string *out);
- 형 변환: static_cast<>() 같은 C++ 형 변환 사용
ch = static_cast<char>(i); //int to char
ch = (char)i; //bad