2014-07-14 6 views
0

스택 개체의 황금률 규칙에 따르면 스택 개체는 함수의 범위를 벗어나면 즉시 삭제됩니다.왜 스택 객체를 반환합니까?

Vec3d Vec3d::operator+(Vec3d const& vec) const{ 
    return Vec3d((x + vec.getX()), (y + vec.getY()), (z + vec.getZ())); 
} 

호출에 생성됩니다 개체가 스택에 실제로 반환됩니다, 그리고 연산자를 invoced 기능에 사용할 수있다 : 하지만 사실은 코드에서이 작품처럼. 그래서 실제로 Vec3d를 사용하려고 시도 할 때 예외가 발생합니다. 오버로드 된 연산자의 메서드 범위를 벗어나기 때문입니다. 왜 작동합니까? 그것은 일종의 인라인 코드입니다. 할당은 itseld 함수 대신에 컴파일러에 의해 함수 호출로 이동됩니다. 또는 스택 개체가 함수 호출 대신 새로운 스택 개체로 다소 복사 된 복사본 생성자 일 ...

저는 C++을 처음 접했고 C++의 메커니즘이 실제로 작동하는지 이해하려고합니다. 당신은 자바와 함께 시작했을 때,하지만 좀 혼란 : D 사전

+0

C++에는 값 의미가 있습니다. – chris

+0

왜 잘못된 개체 액세스가 "예외를 throw"할 것을 제안하는지 확신 할 수 없습니다. 어디서 들었습니까? –

+0

Oh sry, 내 잘못은 모든 것이 예외를 throw하는 Java에 익숙하다고 들었습니다. D – Matze

답변

4

당신은 스택에 생성 된 객체의 사본을 반환하는에

감사를 복사 생성자를 사용하여 구성. 원래 개체를 반환하지 않습니다.

반면에 포인터을 스택에 생성 된 개체로 반환하려고하면 매우 손상됩니다.

+0

참고 : 컴파일러는 실제 복사본을 최적화 할 수 있지만 (논리적으로는 기능). –

+0

@ LokiAstari, 그건 절대적으로 맞습니다. 나는 최근에 이것에 대한 대답을 보았다. 찾으면 답을 업데이트합니다. – merlin2011

관련 문제