2014-06-19 2 views
4

생성자가 오버로드되었다고 가정 해 보겠습니다. 동일한 클래스의 다른 생성자를 사용하여 단일 객체에 대해 여러 데이터 멤버를 초기화 할 수 있습니까?생성자 오버로드로 여러 변수 초기화

예 :

class demo{ 

    int size; 
    double k; 
    public: 
    demo(int s){ 
     size=s; 
    } 
    demo(double p){ 
     k = size+p; 
    } 
    void show(){ 
     cout<<size<<" "<<k<<"\n"; 
    } 
}; 

int main(){ 

    demo a = demo(0); 
    a = 4.7; 
    a.show(); 
    return 0; 
} 

이 가능합니까?

+1

? double로 구성하면'size'는 정의되지 않았고'k'는 정의되지 않은 값 +'p'이기 때문에'k'는 정의되지 않습니다. – Ben

답변

2

아니요, 일단 개체가 구성되면 구성됩니다.

(많은 현대 컴파일러도 디버그 또는 -O0 모드에서 일부 copy-elision을 할 것입니다 점에 유의하시기 바랍니다 더 최적화 없다고 가정)의 당신의 코드를 가서는 무엇을 보자 :

  1. demo(0);

    코드 demo(0)demo(int s) 생성자를 호출합니다. 임시 rvalue이 생성됩니다.

  2. demo a = demo(0);

    demo a

    size = 0 
    k = uninitialized 
    
  3. 다음 암시 copy constructor을 사용하여 만들어집니다 : 그래서 지금 우리는 값을 임시 객체가 있습니다. a가 이미 구성되어 있기 때문에

    size = 0 
    k = uninitialized 
    
  4. a = 4.7;

    , 이것은 암시 assignment-operator를 호출합니다 :

    우리는 이제 다음 값을 a라는 demo 개체가 있습니다. 기본 할당 연산자는 모든 값을 한 객체에서 다른 객체로 복사합니다. 즉, 먼저 4.7demo 개체로 변환해야합니다. 이는 demo(double p) 생성자로 인해 가능합니다. 그래서 임시 demo 객체가 값으로 작성됩니다

    :

    size = uninitialized 
    k = uninitialized + 4.7 = undefined 
    

    이 값은 a에 복사됩니다 그래서 모두 a의 데이터 멤버가 정의되지 않습니다. 여러 매개 변수가있는 생성자를 사용

    songyuanyao의 솔루션

가능한 해결책은 그 일을 한 좋은 방법입니다.

세터 사용은 다른 방법입니다.

어느 쪽이든, 귀하의 생성자가 데이터 멤버에 대한 기본값을 제공하는 것이 좋습니다.

demo(int s) 
{ 
    size = s; 
    k = 0.0; // or some other suitable value 
} 

다음은 설정 도구를 만드는 방법입니다.

void setK (double p) 
{ 
    k = size + p; 
} 

그런 다음이 작업을 수행 할 수 있습니다 : 당신이 무엇을 요구하고있다

int main() 
{ 
    demo a (0) ; 

    a.setK (4.7) ; 
    a.show() ; 

    return 0 ; 
} 
+0

고맙습니다 지금 내게 아주 맑다. :) –

2

당신은 다중 데이터 멤버를 초기화하는 여러 매개 변수를 취할 수 ctor에 정의해야합니다 : 당신을 생각

demo(int s, double p) { 
    size = s; 
    k = size + p; 
} 

다음

int main() { 
    demo a(0, 4.7); 
    a.show(); 
    return 0; 
}