아니요, 일단 개체가 구성되면 구성됩니다.
(많은 현대 컴파일러도 디버그 또는 -O0 모드에서 일부 copy-elision을 할 것입니다 점에 유의하시기 바랍니다 더 최적화 없다고 가정)의 당신의 코드를 가서는 무엇을 보자 :
demo(0);
코드 demo(0)
은 demo(int s)
생성자를 호출합니다. 임시 rvalue이 생성됩니다.
demo a = demo(0);
demo a
size = 0
k = uninitialized
다음 암시
copy constructor을 사용하여 만들어집니다 : 그래서 지금 우리는 값을 임시 객체가 있습니다.
a
가 이미 구성되어 있기 때문에
size = 0
k = uninitialized
a = 4.7;
, 이것은 암시 assignment-operator를 호출합니다 :
우리는 이제 다음 값을 a
라는 demo
개체가 있습니다. 기본 할당 연산자는 모든 값을 한 객체에서 다른 객체로 복사합니다. 즉, 먼저 4.7
을 demo
개체로 변환해야합니다. 이는 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 ;
}
? double로 구성하면'size'는 정의되지 않았고'k'는 정의되지 않은 값 +'p'이기 때문에'k'는 정의되지 않습니다. – Ben