5

C++에서 모든 경우에 false로 초기화되는 새로운 bool에 의존 할 수 있습니까?새 bool이 false로 초기화되도록 할 수 있습니까?

bool *myBool = new bool(); 

assert(false == *myBool); // Always the case in a proper C++ implementation? 

(업데이트 코드는 의견을 반영합니다.)

+0

참고 :이 코드는 templateatization이이 질문의 경우 bool 인 템플릿에 있지만 기본 생성자를 원하는 POD가 아닌 POD 일 수도 있습니다. – WilliamKF

답변

6

이 경우 예; 그 이유는 아주 미묘합니다.

new bool()의 괄호는 값 초기화으로, false으로 초기화합니다. 그것들이 없으면 new booldefault-initialisation을으로 지정하며,이 값은 지정되지 않은 값으로 남습니다.

가능한 경우 개인적으로 가능한 한 new bool(false)을보고 초기화해야한다고 분명히 말합니다.

(이는 new을 사용하는 데는 충분한 이유가 있다고 가정합니다. 스마트 포인터로 관리해야하지만,이 질문의 범위를 벗어납니다.)

참고 :이 질문은 내가 읽었을 때의 대답입니다. 그것은 다른 대답이 쓰여진 후에 그 의미를 바꾸기 위해 편집되었다.

+0

그는 다른 대답에 대한 내 의견을 읽은 후 이미 알고있는 대답을 변경했습니다. – Nawaz

+0

하지만 나는 틀린 인수를 명시 적으로 제공 할 수없고 대신 기본 생성자를 원하는 POD 및 non-POD 개체에 대한 값 초기화에 의존 할 수 있도록 (질문에 표시되지 않은) 템플릿으로 작업하고 있습니다. – WilliamKF

+0

@WilliamKF : 그렇다면 값 초기화를 사용하는 것 외에는 선택의 여지가 없습니다. –

2

번호 C에는 자동으로 초기화가 없다 ++. 새로운 bool은 그 순간에 메모리에 있던 것으로 초기화되며, 사실이 될 가능성이 높습니다 (0이 아닌 값이 모두 true이기 때문에). 그러나 아무런 보장도 없습니다.

당신과 잘 어울리는 컴파일러를 사용하고 항상 새로운 부울에 거짓 값을 할당하는 컴파일러를 사용할 수는 있지만 컴파일러에 따라 다르며 모든 언어 표준을 기반으로하지는 않습니다.

항상 변수를 초기화해야합니다.

+3

아니면'bool * b = new bool()'을 할 수 있습니다. – Nawaz

+0

그래서 빈 args 강제로 거짓? – WilliamKF

+1

@ 윌리엄 KF : 예.:-) 이것은 기본값으로 초기화되는데,이 경우에는 'false'를 의미하는 0으로 초기화됨을 의미합니다. – Nawaz

3

bool이 false로 초기화되고 bool이 불확정 값을 가지며 bool이 다음과 같이 bool이 초기화된다는 것을 의미하는 bool의 초기화, 0 초기화, 기본값 초기화 및 값 초기화의 세 가지 관련 종류가 각각 있습니다. false로 초기화됩니다.

따라서 제로 또는 값 초기화가 필요합니다. 자동 또는 동적 저장 기간을 가진 객체가 초기화 프로그램을 지정하지 않고 초기화되는 경우 기본 초기화가 수행됩니다. 값 초기화를 얻으려면 빈 이니셜 라이저 () 또는 {}이 필요합니다.

bool b{}; // b is value-initialized 
bool *b2 = new bool{}; // *b2 is value-initialized 

class foo { 
    bool b; 
    foo() : b() {} 
}; 
foo f; // // f.b is value-initialized 

당신은 정적 또는 스레드 로컬 저장 기간을 가지며 초기화가없는 부울에 대해 0 초기화를 얻을.

static bool b; // b is zero-initialized 
thread_local bool b2; // b2 is zero-initialized 

당신은 부울는 사용자가 제공하는 생성자가없는 클래스의 멤버와 경우 제로 초기화가 얻는 또 다른 경우 암시 적 기본 생성자가 사소한이며, 클래스 인스턴스가 제로 또는 부가가치 초기화 됨.