2016-11-24 12 views
4
struct A1 
{ 
    int n;   
}; 

struct A2 
{ 
    int n; 
    A2(){}   
}; 

struct A3 
{ 
    int n; 
    A3() = default;   
}; 

질문 1 :암시 적 ctor, no-parameter-empty-body ctor와 명시 적 기본 ctor 사이에 동일합니까?

합니까 C++ 표준 보증 클래스 A1, A2A3은 서로 완전히 동일하다?

질문 2 :

A1 a1; 
A2 a2; 
A3 a3; 

컴파일러가 제로 초기화하지 않음 a1.n, a2.n, C++ 표준에 따라 a3.n?

+2

그 의미가 확실하지 않습니다. 첫 번째는 집계이고 두 번째는 집계가 아닙니다. –

답변

2

A1A3aggregate type 인 반면, A2은 사용자 정의 생성자가 있기 때문에 차이가 없습니다.

  • 을 갖는다

    클래스 타입 (일반적으로 구조체 또는 조합), ...

  • 에는 사용자가 제공 , inherited, or explicit (since C++17) 생성자 (explicitly defaulted or deleted constructors are allowed) (since C++11)
  • ...

A1A3을 의미합니다. d 집계가 초기화되고 A2은 초기화 할 수 없습니다.

A1 a1{99}; // fine; n is initialized to 99 
A3 a3{99}; // fine; n is initialized to 99 
A2 a2{99}; // error; no matching constructor taking int found 

컴파일러는하지 제로 초기화합니다 a1.n, a2.n, C++ 표준에 따라 a3.n?

default initialization의 규칙에 따르면 자동 저장 기간 인 경우 0으로 초기화하지 않으면 모든 값이 불확실합니다. 반면 정적 및 스레드 로컬 객체는 zero initialized입니다. 서로 다른 개체가 다른 초기화를 갖고 있기 때문에

2

그들은 동일하지 않은 : 첫 번째와 마지막 하나가 집계이며, 두 번째는 집계가 배열 또는 클래스

되지 않습니다 (9 절) 사용자 제공 생성자 없음 (12.1), 비 정적 데이터 멤버 (9.2), 비공개 또는 보호 된 비 정적 데이터 멤버 (11 절), 기본 클래스 없음 (10 절)에 대한 중괄호 또는 등가 이니셜 라이저 없음), 가상 기능 없음 (10.3).

여기에 대해 자세히 알아보기 : What are Aggregates and PODs and how/why are they special?

그래서 집계 초기화가 A1A3 작동, 그것은 A2

struct A1 
{ 
    int n;   
}; 

struct A2 
{ 
    int n; 
    A2(){}   
}; 

struct A3 
{ 
    int n; 
    A3() = default;   
}; 


int main() 
{ 
    A1 obj1{42}; 
    //A2 obj2{42}; // error 
    A3 obj3{42}; 


    return 0; 
} 

A1 a1을 위해하지 않습니다; A2 a2; A3 a3; 같은

표준 C++에 따라 변수가 default initialized 될 것 a3.n

컴파일러, a2.n을 a1.n 제로 초기화하지 않음.