기본 멤버 값 모범 사례
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
'IT TIP' 카테고리의 다른 글
PHP에서 '허용 된 메모리 크기 소진'오류를 안전하게 포착 (0) | 2020.11.24 |
---|---|
Amazon S3 스타일 API를 로컬로 제공하는 서버가 있습니까? (0) | 2020.11.24 |
git log를 에뮬레이트하는 방법 --decorate의 분기 유형별로 다른 색상 (0) | 2020.11.24 |
통계 데이터를 저장할 때 DECIMAL, FLOAT 또는 DOUBLE이 필요합니까? (0) | 2020.11.24 |
python docstring의 클래스 메서드에 연결 (0) | 2020.11.24 |