2017-03-31 1 views
2

이 코드를 가지고 :이 생성자가 두 번 호출되는 이유는 무엇입니까?

// Example program 
#include <iostream> 
#include <string> 

class Hello{ 
    public: 
    Hello(){std::cout<<"Hello world!"<<std::endl;} 
}; 

class Base{ 
    public: 
    Base(const Hello &hello){ this->hello = hello;} 
    private: 
    Hello hello; 
}; 

class Derived : public Base{ 
    public: 
    Derived(const Hello &hello) : Base(hello) {} 
}; 

int main() 
{ 
    Hello hello; 
    Derived d(hello); 
    return 0; 
} 

결과 인쇄는 다음과 같습니다 이런 이유

Hello world! 
Hello world! 

?

+3

이 이동 시맨틱 할 수 없다; 당신의 코드에는 움직임이 없습니다. –

답변

17

구성원 (this->hello = hello; 지정 전)이 Base 인 기본 설정시 호출됩니다.

이 (즉 파라미터 hello에서 직접 hello 부재 복사 구성하는) 것을 방지하기 위해 회원 초기화리스트를 사용

Base(const Hello &hello) : hello(hello) { } 
관련 문제