IT TIP

기본 멤버 값 모범 사례

itqueen 2020. 11. 24. 20:46
반응형

기본 멤버 값 모범 사례


C ++ 11 코드를 작성할 때 클래스의 헤더 파일에서 클래스 멤버의 기본값을 설정하는 것이 좋은 습관입니까?

아니면 클래스 생성자에서이 작업을 수행하는 것이 더 낫습니까?

편집하다:

내말은:

foo.h :

#include <string>

using std::string;

class Foo{
    private:
        string greet = "hello";
    public:
        Foo();
};

VS

foo.cpp (물론 필요한 헤더 파일이 있지만 클래스 내 초기화 없음) :

Foo::Foo(){
    greet = "hello";
}

어느 것이 더 낫고 그 이유는 무엇입니까?


클래스 멤버가 항상 동일한 초기 값으로 초기화되는 경우 중복을 방지하기 위해 이니셜 라이저를 인라인으로 만들어야합니다. 초기 값이 생성자에 따라 다르면 생성자 이니셜 라이저 목록에 넣습니다. (그리고 당신이했던 방식으로 할당을 사용하지 마십시오.)

예:

class Foo
{
    bool done = false;   // always start like this
    int qty;
    Bar * p;

public:
    Foo()                        : qty(0),              p(nullptr)    { }
    Foo(int q, Bar * bp)         : qty(q),              p(bp)         { }
    explicit Foo(char const * s) : qty(std::strlen(s)), p(new Bar(s)) { }

    // ...
};

이 가상 예제에서 멤버 done는 항상로 시작해야 false하므로 이니셜 라이저를 인라인으로 작성하는 것이 가장 좋습니다. 다른 두 멤버 qty와는 p그들이 목록 초기화 생성자 '내부 초기화되도록, 세 가지 다른 생성자 각각 다르게 초기화 할 수 있습니다.

curiosum : 인라인 이니셜 라이저를 제공하면 클래스에 사소한 기본 생성자가 없습니다 .


C ++ 11을 사용하지 않을 때는 생성자에서 대부분의 멤버 (모두 비 정적)를 초기화해야합니다. 더 나아가 많은 사람들은 이것이 명시 적으로 기본 ctor를 호출하는 것을 의미하더라도 모든 멤버를 명시 적으로 초기화하도록 주장합니다. 일반적으로 헤더 파일이 아닌 cpp 파일에 구현 세부 정보를 배치해야하므로 예제는 다음과 같습니다.

Example:
//foo.h

class Foo{
public: 
  Foo();
private:
  std::vector<int> vect;
};

//foo.cpp

Foo::Foo():vect(){
}

C ++ 11에서는 더 많은 선택권이 있으며 클래스 멤버 초기화 프로그램은 특히 cors가 여러 개인 경우 매우 편리합니다. 자세한 내용은 다음 링크를 참조하십시오. http://www.stroustrup.com/C++11FAQ.html#member-init

After Edit: According to your code you are using C++11. To my knowledge there is only few information on good practice concerning the new possibilities but IMHO In class member initializer are very handy to concentrate initialization in one place, which reduces complexity and typing


Initializing in headers has the main advantages of keeping code more local and easy to understand. It saves also some typing.

The main disadvantage, in my opinion, is the need to include more headers to get access to constructors. Simple forward declaration won't suffice, making compilation take longer.

참고URL : https://stackoverflow.com/questions/11594846/default-member-values-best-practice

반응형