2017-10-03 11 views
0

Scott Myers Effective C++를 통해 작업하고 있습니다. 텍스트에 다음 내용이 표시됩니다. doSomething() 유형 B bObject의 인수가 필요합니다 대한기본 생성자를 사용하는 명시 적 형변환

enter image description here

내가 어려움이 유효한 구문 문 doSomething(B(28));

에 무슨 일이 일어나고 있는지 이해하는 데 어떻게 정확하게 B(28)에서 생성 된 클래스 B의 개체입니다. 따라서 정의 doSomething()을 가정 또한

class B{ 
    int b; 
public: 
    explicit B(int x = 0, bool b = true); 
} 

: 또한

, 다음 class B의 모든 정의는 가정

doSomething(B(28));
void doSomething(B bObject){ 
    bObject.b = 1; 
} 

상기 b 부재 어떻게 액세스? 즉, 멤버 변수 b은 어떤 객체에 액세스 했습니까?

+2

'class_name (parameters)'는 지정된'parameters'를 사용하여'class_name'의 임시 객체를 생성합니까? – NathanOliver

+1

임시 ('B (28)')는'doSomething' 범위의 기간 동안 객체를 생성하고 그것을 bObject에 할당합니다. 그 후, 대상은 파괴된다. – Amadeus

답변

1

B는 int 매개 변수를 취하는 유효한 생성자가있는 클래스입니다. 즉, B가 int를 전달할 때 자체를 구성하는 방법을 알고 있다고합니다.

28은 int의 유효한 표현입니다.

B (28) int를 취하는 생성자를 사용하여 'B'클래스를 인스턴스화하는 방법입니다.

'B'의 생성자는 int와 bool을 취하지 만 두 매개 변수는 모두 "선택 사항"이며 int 매개 변수에 대해 "= 0"으로 표시되고 "=" true "를 반환합니다.

매개 변수가 선택적이므로 B는 매개 변수를 지정하지 않고 구성 할 수 있습니다.이 경우 매개 변수는 x = 0 및 b = true로 구성됩니다. 또한 예제에서와 같이 지정된 int 매개 변수를 사용하여 구성 할 수도 있습니다. 예제의 경우 x = 28이고 b = true입니다. 또한 두 매개 변수를 모두 지정하여 구성 할 수도 있습니다. 예 : B (8, 거짓). 그러나 bool 매개 변수 만 지정할 수는 없습니다. 예를 들어 B (false)는 작동하지 않습니다. 선택적 매개 변수를 채울 때 매개 변수를 건너 뛰는 방법은 없습니다. B (, false)가 유효하지 않습니다 ...

그래서 B (28)는 x = 28 인 B 객체를 만듭니다.

이제 DoSomething 함수는 'B'객체를 전달해야합니다. B (28)는 'B'객체의 유효한 구성이기 때문에 DoSomething의 매개 변수 목록을 충족시킵니다.

당신이 호출 할 때 :

DoSomething(B(28)); 

A 'B'개체를 구성하고 인수로 해봐요 전달됩니다. 함수 내부

는, B는 'bObject'라고 함수 서명 이유는

DoSomething(B bObject)... 

이 기능 서명이 전달 될 타입 'B'의 무언가를 원하고,이 같은 언급 될 것이다 함수 안에있는 bObject.따라서

,

bObject.b = 1; 

구성되고이 함수에 전달 된 B 클래스의 'B'부재에 1의 값을 할당한다.

아마도 다소 혼란스러운 이유는 DoSomething이 B 클래스의 b 멤버 설정을 완료하고 함수가 종료되면 B 클래스는 더 이상 존재하지 않으므로 DoSomething 함수를 종료 한 후에는 증명할 수있는 방법이 없다는 것입니다. b 멤버가 수정 된 것입니다.

임시 객체를 함수에 전달하고 수정 한 다음 존재하지 않게하는 것은 다소 쓸모없는 일입니다. 내가 알 수있는 한.

실제로 작성자가 설명하려고하는 것은 생성자에서 '명시 적'의 중요성입니다. 이 예제는 인수에 대한 암시 적 변환을 제외하고 명시 적 생성자에 대한 자신의 지적을 돕습니다.