2012-01-08 4 views
6

저는 현재 ctors를 배우고 있으며 몇 가지 질문이 있습니다.C++ 객체 생성 및 생성자

Foo obj(args); 

Foo obj2; 
obj = Foo(args); 

Foo obj3 = Foo(args); 

첫 번째 부분 : 단 1이라고 생성자 (푸) 및 obj가 초기화 될이 라인에서. 그래서, 1 개체 생성.

두 번째 부분 : 임시 개체 obj2 만들기 : 기본 개체 호출. 다음 줄에 Foo의 복사본을 만들고 복사본을 operator=()에 전달합니다. 그게 맞습니까? 따라서 3 개의 로컬 임시 객체, 2 개의 생성자 호출.

세 번째 부분 : 1 개체 Foo를 생성하고 operator=()에 복사 패스. 그럼, 2 개의 임시 물건과 1 ctor 호출.

이 권리를 이해합니까? 그리고 그것이 사실이라면 컴파일러 (예 : 마지막 gcc)가 일반적인 경우에이를 최적화할까요?

+0

'operator =()'는 일반적으로 참조로 인수를받습니다. 따라서 호출시 복사본이 없습니다. – rodrigo

+0

obj3은 실제로 할당 생성자가 아닌 복사 생성자를 사용하여 생성됩니다. –

답변

6

내가 먼저 세 번째에 대해 언급합니다 :

Foo obj3=Foo(args); 

이 복사 과제라고 operator=를 사용하지 않습니다. 대신 복사 생성자를 호출합니다 (이론적으로). 여기에는 과제가 없습니다. 그래서 이론적으로 두 가지 객체 생성이 있습니다. 하나는 임시이고 다른 하나는 obj3입니다. 컴파일러는 코드를 최적화하여 임시 객체 생성을 완전히 생략 할 수 있습니다. 이제

, 두 번째 :

Foo obj2;   //one object creation 
obj = Foo(args); //a temporary object creation on the RHS 

다음은 첫 번째 라인은 기본 생성자를 호출하는 개체를 만듭니다. 그런 다음 operator=을 호출하여 Foo(args) 표현식에서 생성 된 임시 객체를 전달합니다. 그래서 operator=이라는 두 개의 객체 만이 const 참조로 인수를 취합니다 (이것이 무엇을 해야하는지).

첫 번째 문제는 옳습니다.

+0

알겠습니다. 고마워요. 하지만 어쨌든, 첫 번째 경우에는 'Foo'유형의 객체 1 개만 생성됩니다. 세 번째 객체에는 객체 2 개가 생성됩니까? – Ockonal

+0

아니요, 사양에 따르면 1 부와 3 부는 동일한 것을 지정하는 두 가지 방법입니다. 구현에는 차이가 없습니다. –

+2

@ Mr Resister : 아니요. '1'과 '3'사이에는 약간의 차이가 있습니다. 테스트 코드를 작성하고 복사 생성자를 private로 만듭니다. 1 번째 컴파일은, 3 번째는 컴파일되지 않습니다! – Nawaz

3
  1. 예, Foo obj(args)은 하나의 Foo 객체를 만들고 ctor를 한 번 호출합니다.

  2. obj2은 임시 개체로 간주되지 않습니다. 그러나 1 Foo obj2과 같이 하나의 객체를 만들고 Foo ctor를 호출합니다. 다음 줄에 obj2 = Foo(args)을 의미한다고 가정하면이 줄은 하나의 임시 Foo 객체를 만든 다음 obj2.operator=()을 호출합니다. 따라서이 두 번째 예제에는 단 하나의 임시 객체 만 있고 임시가 아닌 단일 Foo ctors는 두 번 호출됩니다 (비 임시 일 경우 한 번, 임시 일 경우 한 번). 연산자 =()는 한 번 호출됩니다.

  3. 아니요,이 행은 operator=()을 호출하지 않습니다. obj3을구문을 사용하여 초기화하면 거의 괄호를 사용하는 것과 같습니다. Foo obj3(Foo(args));이 줄은 임시 개체를 만든 다음 Foo 복사본을 호출하여 해당 임시 개체를 사용하여 obj3을 초기화합니다.

1

용어가 약간 혼란 스럽습니다.

개체 obj, obj2obj3은 "임시 개체"로 불리지 않습니다. obj에 할당되기 전에 3 행에서 작성된 인스턴스 만 임시 오브젝트입니다.

또한 "Foo 복사본"을 만들지 않고 "Foo 인스턴스"또는 "Foo 유형 개체"를 만듭니다.