Class, Struct 그리고 변수

클래스 멤버 선언 순서

class MyClass : public OtherClass
{
public:      // Note the no indent!
    MyClass();  // Regular 1 tab indent.
    explicit MyClass(int var);
    ~MyClass() {}

    void SomeFunction();
    void SomeFunctionThatDoesNothing() {}

    void set_some_var(int var) { some_var_ = var; }
    int some_var() const { return some_var_; }

private:
    bool SomeInternalFunction();

    int some_var_;
    int some_other_var_;
    DISALLOW_COPY_AND_ASSIGN(MyClass);
};
  • base 클래스명은 서브클래스명과 같은 라인에 적는다.

  • public:, protected:, private: 키워드는 들여쓰기 하지 않는다.

  • public, protected, private 순서로 구역을 나눈다. 빈 줄로 구역을 구분한다.

  • 각 구역마다 method, data member 순으로 선언한다. 자세한 순서는 다음과 같다.

    1. Typedef, Enums, Constants (static const)

    2. 생성자, 소멸자

    3. method, data member (except static const)

구조체(structs)와 클래스(classes)

  • 구조체는 자료를 담는 수동적인 객체를 위해서만 사용하고, 그 밖의 것은 클래스를 사용한다.

  • 구조체에는 상수도 정의할 수 있으나 필드(멤버)를 읽고 쓰는 기능외에는 없다.

  • 필드를 읽고 쓸 때는 메소드를 사용하지 않고 직접 필드에 접근한다.

  • 구조체의 메소드는 필드를 setup 할 때만 사용한다. 예를들면, 생성자, 소멸자, Initialize(), Reset(), Validate() 등이다.

  • 기능성이 더 필요한 경우에는 클래스를 사용한다.

  • STL과의 일관성을 위해 functors 나 traits에 대해 클래스 대신 구조체를 사용할 수 있다.

  • ‘변수 이름’에서 정했듯이 구조체와 클래스 멤버 변수의 명명규칙은 다르다.

변수 이름

string table_name;  // OK - uses underscore.
string tablename;   // OK - all lowercase.

class Test
{
private:
    string table_name_;  // OK - underscore at end.
    string tablename_;   // OK.
}

struct UrlTableProperties
{
    string name;
    int num_entries;
}
  1. 일반적으로 변수 이름은 소문자와 밑줄문자( _ )만으로 만든다. 대문자를 섞어 쓰지 않는다.

  2. 클래스의 멤버 변수는 밑줄문자( _ )로 끝난다.

  3. 구조체의 멤버(필드)명은 클래스의 멤버 변수와 달리 밑줄문자( _ )로 끝나지 않는다.

  4. 전역 변수는 가급적 정의하지 않는다. 정의할 경우 전역 변수 이름은 g_ 로 시작한다.

지역 변수

int j = g();  // Good
int i;
i = f();  // Bad
  • 함수내의 변수선언은 가장 좁은 범위에서 변수의 최초 사용과 가까운 곳에 하고 선언하는 곳에서 초기화를 한다.