2012-01-21 2 views
2

나는 수업 시간, 을 만들어 주에 선언 :does = 변수를 복사 생성자 C++과 동일하게 선언 할 때?

time a; 
time b=a; 

이는 것과 같습니다

time b(a); 

??? 또한 함수를 만든 :

time f(time t) 
{ 
    return t; 
} 

을하고 선언 후 주에 그것을 사용 : 복사 생성자가 호출 때 메시지를 인쇄

time b=f(a); 

는, 결과가 생성자를 복사하는 경우에만이 호출 한 복사 a를했다 T는, 다른 반환하는 t 복사, 거기에 거기에 내 질문은 복사 생성자에 대한 호출이 함수에서 B로 반환 된 값을 복사했다?

미리 감사드립니다.

+0

기본 ctor, ctor 및 대입 연산자에서 일부 추적 cout <<을 추가하는지 확인하십시오. –

+0

@AndersK 내가 그랬고 그 이유는 왜 내가 대답을 optmization 답을 것 마지막 질문을 물었다! – Khaledvic

답변

2

헤더의 질문과 게시물 하단의 질문이 다릅니다. 헤더에있는 경우 :

do = 복사 생성자 C++과 같은 변수를 선언 할 때?

정확하게는 아닙니다. 먼저 오른쪽에있는 표현식이 왼쪽에있는 유형으로 변환 된 다음 복사 생성자가 호출됩니다. 이를 위해서는 암시 적 변환이 필요합니다. 가능하지 않으면 초기화가 컴파일되지 않습니다. 오른쪽에있는식이 이미 올바른 유형이면 첫 번째 단계는 필요하지 않습니다.

기타 문의 사항은 return value optimization입니다.

0

아니요, b = a는 할당 연산자 (operator =)를 사용하여 새 빈 시간 개체를 만든 다음 연산자를 호출하여 값을 그 개체로 옮깁니다.

종종 컴파일러에서 생성 한이 버전은 복사 생성자를 호출하지만, 그렇게하지 않아도됩니다.

참고로 explicit 키워드를 찾아보십시오. 객체 복사는 두 가지 방법 (copy ctor 및 대입 연산자)으로 수행 할 수 있으므로 암시 적이 아니라 명시 적으로 호출 될 때만 복사기를 사용하도록 컴파일러에 지시합니다.

모든 다른 생성자 (새 C++ 0x 이동 하나 포함)와 할당 연산자로 클래스를 만들고 디버거를 통해 실행할 때 어떤 일이 발생하는지 살펴 봅니다.

+0

잘못되었습니다. 초기화에 사용될 때'='는'operator ='가 아닙니다. –

+0

이제 우리는 C++ 11을 얻었습니다 :'operator ='가 호출되면'a'를 이동시키지 않고'b'에 복사합니다. 중요한 차이점. – Grizzly

2

예, time b = a은 객체를 선언하고 그 값을 동시에 할당하므로 time b(a)과 같습니다.

질문의 두 번째 부분에 대해 컴파일러는 일반적으로 최적화 수준에 따라 가능한 불필요한 개체 복사본을 제거합니다.객체가 다른 객체로부터 생성되고

0

, 복사 생성자

시간 = B는 A라고; 또는 시간 b (a);

하지만 개체가 이미 생성하고 당신이 그것을 항목을 복사 할 때, 다음 연산자 = 이

의 차이라고는, 당신이 복사 생성자를 사용하는 경우 동적으로 할당 된 메모리 을 사용하는 경우처럼 당신이 아직 만들어지지 않았 음을 의미하므로 메모리 관리를 정리할 필요가 없습니다.

그러나 객체를 다른 객체에 할당 할 때 먼저 동적으로 할당 된 자체 메모리의 요소 , 그 다음 자신의 것으로 복사하십시오