2016-10-06 7 views
0

일부 장소를 읽은 후에 혼란 스럽습니다.C++ 클래스에는 기본 constuctor가 있고 다음과 같은 경우에 어떤 생성자가 호출됩니까?

나는이 예제에서 예제를 작성 중입니다. page 구성원 (Author)이 구성원 중 하나 인 클래스 (Book)가 있다고 가정 해 봅시다. 여기에 생성자가 있습니다 :

Book::Book(string name, Author author, double price, int qtyInStock) 
     : name(name), author(author) { **// Must use member initializer list to construct object** 
    // Call setters to validate price and qtyInStock 
    setPrice(price); 
    setQtyInStock(qtyInStock); 
} 

나는 이니셜 라이저 lisr 대신 생성자 내에서 객체 작성자를 선언하려고했습니다. 그것은 나에게 오류를 줬다. no matching function to call Author::Author() -> 작성자의 기본 구성입니다.


이 유래 게시물에서 읽은 후 : this1this2 내가 아는 바로는 그 2에서 요약,이다 :

객체는 실행이 몸에 들어갈 때 완전히 초기화해야 & 간주됩니다
  • 생성자의 이름 :

  • 개체의 모든 멤버가 초기화 목록에서 초기화됩니다. 명시 적 존재를 초기화하지 않더라도, 컴파일러는 행복하게, INT와 같은 당신

  • 기본 유형 그렇게 또는 더블 기본 생성자 위의 모든 이들로부터 그래서

이 무엇을 할 것 인 I 이해는 입니다. 사용자 정의 객체/클래스는 기본 유형과 달리 기본 생성자을 자동으로 갖지 않습니다. 그 이유는 컴파일러가 (사용자 정의 클래스)에없는 기본 생성자를 사용하여 초기화하려고하기 때문에 복사 생성자를 호출하는 멤버 초기화 목록을 사용하지 않으면 오류가 발생합니다.

그래서 가능한 해결 방법은 다음과 같습니다 클래스가 있는가 "얼마나 많은 기본 방법 : 그 말에 유래에이 post를 읽을 다음 클래스의 기본 생성자를 정의하거나 멤버 이니셜 라이저


를 사용하여 ? " 대답은 그것이 기본 consturctor이있는 경우

1. 왜 내 첫 번째 경우 (책과 저자 클래스) 오류를 주는가 그것은 기본 생성자을 가지고 언급?

이 또한 나는이 page 읽고, 내가 전에 클래스 포인트를 정의라고 할 수 있습니다, 다음 페이지는 썼다 : 우리는 위와 같이 선언 할 때

Point p1;  // **Invoke default constructor** 
       // OR Point p1 = Point(); NOT Point p1(); 

2. 그래서,이 기본 생성자를 호출합니까? 그렇다면 오류가 발생하지 않는 이유는 무엇입니까? 클래스에 기본 생성자가 없다고 생각 했나요?당신은 내가 여기 일을 명확히하고, 위의 두 questons에 대답 할 수 있다면

는 감사합니다 (이탤릭체)

+0

'저자'클래스 정의를 포함하여 코드를 게시해야합니다. 지침은 다음을 참조하십시오. – xaxxon

+1

"클래스에 기본 생성자가 없다고 생각 했습니까? *"이 결론으로 ​​이어진 추론을 따라 가야합니다. 거기에서 결함을 발견 할 것입니다. 그대로 서서, 당신의 질문은별로 의미가 없습니다. – juanchopanza

+0

@xaxxon 저자 클래스 정의는 내가 언급 한 링크에 있습니다. https://www.ntu.edu.sg/home/ehchua/programming/cpp/cp3_OOP.html – mon

답변

1

전체 대답은 큰이며, 여기에 제시되어

http://en.cppreference.com/w/cpp/language/default_constructor

하는 경우 당신은 특별히 하나를 만들고, 항상 기본 생성자가 있습니다. 여기에는 매개 변수를 받아 들일 수 있지만 기본 매개 변수가있는 생성자가 필요없는 생성자가 포함되며 가변 템플릿은 모두 기본 생성자가 될 수 있습니다.

= delete으로 표시하면 절대로 표시되지 않습니다. 어떤 사용자가 제공 한 생성자가 존재하지 않는 경우

그렇지 않으면, 컴파일러는 (완전히 삭제 된 암시 적으로 선언 기본 생성자 섹션에서 위의 링크에 나와있는) 특정 상황에서

을 제외하고 당신을 위해 하나를 만들려고합니다
  • T에는 기본 이니셜 라이저가없는 참조 유형의 구성원이 있습니다.

  • T에는 사용자 정의 기본 생성자 또는 기본 멤버 초기화 프로그램 (C++ 11 이후)이없는 const 멤버가 있습니다.

  • T에는 삭제 된 기본 생성자가있는 구성원 (기본 구성원 이니셜 라이저가 없음)이 있거나이 생성자에서 기본 생성자가 모호하거나 액세스 할 수 없습니다.

  • T에는 삭제 된 기본 생성자가있는 직접 또는 가상 기반이 있거나이 생성자에서 모호하거나 액세스 할 수 없습니다.

  • T에는 삭제 된 소멸자가 있거나 소멸자가있는 직접 또는 가상 기반이 있거나이 생성자에서 액세스 할 수없는 소멸자가 있습니다.

  • T는 변형되지 않은 기본 생성자가있는 변형 멤버 M이있는 비 공용화 클래스이며 M이 포함 된 익명 공용체의 변형 멤버에는 기본 멤버 이니셜 라이저가 없습니다.

및 일부 공용 규칙 유형에 대한 규칙.

tl; dr : 복잡합니다.

+0

우리가 Point p1을 선언 할 때; // 기본 생성자를 호출 // 또는 포인트 p1 = 포인트(); 포인트 P 1(); 기본 consturctor Point()를 호출하지만 Point에는 자체 consturctor가 있습니까? – mon

+0

코드를 제공하지 않았습니다. – xaxxon

+0

내가 언급 한 링크에 https://www.ntu.edu.sg/home/ehchua/programming/cpp/cp6_Inheritance.html – mon

0

모든 개체에 대해 암시 적 기본 생성자가 만들어지지 않습니다.

기본 규칙은 개체에 어떤 종류의 생성자도없는 경우 암시 적 기본 생성자를 할당한다는 것입니다.

나는 그들이 만들어 질 때 지시하는 모든 특정한 규칙들을 다루지 않을 것이므로, here에서 그들을 읽는 것이 더 낫다. 오류 메시지에 대한 질문 1로

는 :

내가 대신 초기화 목록의 생성자 내부의 객체 저자를 선언했습니다. 그것은 나에게 오류를 줬다.

오류가 발생한 코드를 표시하지 않으므로 아래와 같을 것이라고 가정합니다. 내가 틀렸다면 나를 수정하십시오. 이니셜 라이저 목록 내 - - 암묵적을 시켜서 :이 값에 의해 선언 된 객체가이 두 가지 방법 중 하나를 초기화해야합니다 중첩 된 언어 규칙 때문에

// sample A - Bad code, wont compile 
class Author { }; 
class Book 
{ 
public: 
    Book(int x, Author y): n(1) { 
     a(y); //-this line does NOT compile. 
       // initialization of a must be in the initializer list, 
       // between : and { 
    } 
private: 
    Author a; 
    int n; 
}; 

위의 컴파일되지 않는 이유는 컴파일러는 기본 생성자를 호출합니다. 객체에 객체가 있으면 작동합니다.

마지막으로, 질문 2, 예, 해당 클래스의 샘플 생성자는 클래스의 기본 선언자를 호출합니다. 기본 생성자가 존재하는지 여부를 명확히하기 위해 언어 참조를 참조하십시오.