2012-12-06 3 views
1
const ClassA& curShot = vec_shots[curShotIndx]; 

위의 코드에서 curShot 객체는 동일한 단계에서 생성되고 할당됩니다. 내 질문에 위의 진술에서 사용되는 생성자입니다. 나는 그것이 할당 연산자가 뒤 따르는 기본 생성자가 될 것이라고 생각했지만 복사 생성자를 대신 호출하는 것 같다. 왜 그런 경우입니까? 어떻게됩니까동일한 단계에서 새 객체와 할당을 구성하는 것

+0

앰퍼샌드 ('&')는 질문에서 오타입니다. 그렇지 않습니까? –

+0

'curShot'은'const' 참조입니다. 비슷하게 다음과 같은 일을합니다 :'const ClassA * const curShot = vec_shots [curShotIndx];' – iammilind

답변

4

vec_shots[curShotIndx]; 

당신이 const ClassA& curShot에 할당 참조를 반환한다는 것입니다. 이 단계에서는 개체 생성이 필요하지 않습니다. 따라서 생성자가 호출되지 않습니다 (기본값도 복사 생성자도 아님).

하나의 개체 인스턴스를 다른 개체 인스턴스에 할당하지 않고 참조 만하기 때문에 할당 연산자가 호출되지 않습니다. 이 코드에서 둘 이상의 (기존) 객체 인스턴스를 처리하지 않습니다. 따라서 구성이나 할당이 호출되지 않습니다.

+0

Andreas, 고맙습니다. 그러나 & 그것으로 무엇을 할 것인가에 대해 확신하지 못했기 때문에 귀하의 답변에 감사드립니다. – vkaul11

1

생성자가 사용되지 않습니다. curShot은 참조입니다. 독립 실행 형 개체가 아닌 기존 개체의 별칭입니다.

또한 동일한 단계에서 초기화 및 할당을 수행 할 수 없습니다. 예를 들어, copy이이 original를 사용 initalized 것, original 할당되지 않은 다음

ClassA original; 
ClassA copy = original; 

있었다 말한다. 이를 복사 초기화라고합니다.

당신이

ClassA copy2(original); 

을했다면이가 직접 초기화를 호출 할 것이다.

복사 생성자는 두 인스턴스 모두에서 호출됩니다. 당신이 이미 존재하는 객체에 operator =를 사용할 때

할당은 (copy elision이 발생할 수 있으므로 호출되지 않을 수 있습니다,하지만이 가능해야합니다) :이 문은 단지 참고 자료로 curShot을 정의

ClassA x; 
ClassA y; 
x = y;  //assignment 
+0

-1 * 복사 생성자는 두 인스턴스 모두에서 호출됩니다. * 잘못 오해의 여지가 있습니다. –

+0

@Als 어느 것이 호출되지 않습니까? –

+0

복사 생성자가 복사 초기화 중에 완전히 호출되는지 여부는 클래스 정의에 따라 다릅니다. 클래스가 복사 생성자보다 더 적합한 일치 변환 연산자를 제공하면 사용됩니다. –

0

, 그것은 새로운 대상이 아닙니다.

1

"복사 생성자를 호출하는 것 같습니다."질문에 앰퍼샌드가 오타라고 가정합니다 (). 이 경우
, 당신이

const ClassA curShot = vec_shots[curShotIndx]; 

가 복사 건설로 평가를 할 것이라고합니다. 못생긴 const ClassA curShot(vec_shots[curShotIndx])과 같습니다. 당신이 쓰는 경우

그러나

ClassA curShot; // I skipped the "const", because otherwise the example would be invalid. 
curShot = vec_shots[curShotIndx]; 

는 기본 생성자가 호출되는 및 opearator=은 두 번째 줄에서 호출됩니다.


또한, "="너무 많은 당신이 가질 수있는, 복사 생성자 NOR operator= 어느 쪽도 호출 의미 할 수있다 : 여기

const ClassA f(){ return ClassA(); } 
//... 
const ClassA curShot = f(); // we would expect here a copy constructor call 

을 - 컴파일러는 반환 값 최적화를 사용하고 보통 경우는 않습니다 - curShot에 기본 생성자 만 호출됩니다.

+0

그것은 맞지 않습니다. 나는 바로 잡을 것입니다. –

+0

사실 오타였습니다. 감사. – vkaul11

관련 문제