C ++ : 생성자에서 변수를 초기화 할 위치 [중복]
중복 가능성 :
C ++ 초기화 목록
옵션 1과 옵션 2에서 변수 초기화의 장단점은 무엇입니까?
class MyClass
{
public:
MyClass( float f, char a );
private:
float mFloat;
char mCharacter;
bool mBoolean;
int mInteger;
};
MyClass::MyClass( float f, char a ) : mFloat( f ), mBoolean( true ) // option 1.
{
// option 2
mCharacter = a;
mInteger = 0;
}
편집 : 옵션 2가 왜 그렇게 흔한가요?
요컨대, 가능하면 항상 초기화 목록을 선호하십시오. 2 가지 이유 :
클래스의 초기화 목록에서 변수를 언급하지 않으면 생성자가 작성한 생성자의 본문을 입력하기 전에 기본적으로 변수를 초기화합니다. 즉, 옵션 2는 각 변수가 기본 초기화에 한 번, 생성자 본문의 할당에 대해 두 번 기록되도록합니다.
또한 다른 답변에서 mwigdahl 및 avada에서 언급했듯이 const 멤버와 참조 멤버 는 초기화 목록 에서만 초기화 할 수 있습니다.
또한 변수는 항상 초기화 목록에 나열된 순서가 아니라 클래스 선언에 선언 된 순서에 따라 초기화됩니다 (적절한 경고를 활성화하면 컴파일러가 목록이 순서가 잘못 작성되면 경고를 표시 함). 마찬가지로 소멸자는 클래스 소멸자의 코드가 실행 된 후 클래스 선언에서 마지막에서 처음으로 반대 순서로 멤버 소멸자를 호출합니다.
이 특정 예제에는 적용되지 않지만 옵션 1을 사용하면 참조 유형 (또는 const
아래에서 지적한대로 유형) 의 멤버 변수를 초기화 할 수 있습니다 . 옵션 2는 그렇지 않습니다. 일반적으로 옵션 1이 더 강력한 접근 방식입니다.
생성자는 "초기화 목록"또는 "할당"을 사용해야합니까?를 참조하십시오 .
간단히 말해서, 특정 경우에는 아무것도 변경하지 않습니다. 그러나:
- 생성자가있는 클래스 / 구조체 멤버의 경우 옵션 1을 사용하는 것이 더 효율적일 수 있습니다.
- 옵션 1 만 참조 멤버를 초기화 할 수 있습니다.
- 옵션 1 만 있으면 const 멤버를 초기화 할 수 있습니다.
- 옵션 1 만 해당 생성자를 사용하여 기본 클래스를 초기화 할 수 있습니다.
- 옵션 2 만 생성자가없는 배열 또는 구조체를 초기화 할 수 있습니다.
옵션 2가 더 일반적인 이유는 옵션 1이 잘 알려져 있지 않고 장점도 없다는 것입니다. 옵션 2의 구문은 새로운 C ++ 프로그래머에게 더 자연스럽게 느껴집니다.
옵션 1을 사용하면 멤버 변수를 명시 적으로 초기화하기 위해 정확히 지정된 위치를 사용할 수 있습니다.
다른 많은 이유가 있습니다. 가능하면 항상 초기화 목록의 모든 멤버 변수를 초기화해야합니다.
http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6
Option 1 allows you to initialize const
members. This cannot be done with option 2 (as they are assigned to, not initialized).
Why must const members be intialized in the constructor initializer rather than in its body?
참고URL : https://stackoverflow.com/questions/6822422/c-where-to-initialize-variables-in-constructor
'programing tip' 카테고리의 다른 글
"git push heroku master"는 푸시 할 위치와 다른 리포지토리로 푸시하는 방법을 어떻게 알 수 있습니까? (0) | 2020.09.19 |
---|---|
g ++에 라이브러리 경로를 어떻게 포함합니까? (0) | 2020.09.19 |
글로벌 네임 스페이스가 오염된다는 것은 무엇을 의미합니까? (0) | 2020.09.19 |
Rails 4.2 개발 서버의 기본 바인딩 IP를 변경하는 방법은 무엇입니까? (0) | 2020.09.19 |
미디어 쿼리에서 작동하지 않는 CSS 네이티브 변수 (0) | 2020.09.19 |