3

C++은 b1 위해 보여주는 아래의 예로서, 초기리스트를 통해 대중 구성원의 값을 설정하는 클래스의 인스턴스를 허용한다 :C++ : 초기화리스트 작성은 어떻게 이루어 집니까?

class B { 
public: 
    int i; 
    std::string str; 
}; 

B b1{ 42,"foo" }; 
B b2(); 

; 그러나, 생성자를 제공하면

B(int k) { } 

이 컴파일되지 않습니다.

그럼, 두건의 뒤에서 무슨 일이 일어나고있는거야? 생성자가 없으면 컴파일러에서 제공합니까? 하지만 어떻게 초기화 목록을 제공 할 수 있습니까? 예를 들어 b2에 대해 보여 주듯이 입력이없는 "빈"생성자 만 제공 할 것이라고 생각했습니다. 아니면 둘 다 제공합니까?

답변

5

어떻게 초기화 목록을 제공 할 수 있습니까?

아니요, 그렇지 않습니다.

list initializationB b1{ 42,"foo" };의 경우, aggregate initialization이 수행됩니다.

T이 집계 유형 인 경우 집계 초기화가 수행됩니다.

array type 
class type (typically, struct or union), that has 

    no private or protected non-static data members 
    no user-provided, inherited, or explicit constructors (explicitly defaulted or deleted constructors are allowed) 
    no virtual, private, or protected base classes 
    no virtual member functions 

이유 B b1{ 42,"foo" }; 작품도있다 :

그리고 B

집계가 다음 유형 중 하나입니다 aggregate type입니다.

그리고 당신은 사용자 정의 생성자를 제공하는 경우, B 비 집계 형이되고, 다음 집계 초기화가 다시 작동하지 않습니다. 이 경우 BB b1{42}; 또는 B b2(42);과 같이 초기화해야만 해당 생성자가 호출됩니다.

BTW은 : 사용자 정의 생성자를 제공 한 후, 다시 implicitly-declared default constructor 컴파일러가 선언되지 않을 것이다 (하나 개의 매개 변수를 가지고). B b2; 또는 B b2{};은 다시 작동하지 않습니다.

BTW2 : B b2(); 함수 선언 될 수 있습니다. Most vexing parse을 참조하십시오.

관련 문제