0

나는 약간의 코드를 작성했으며 갑자기 내가하고있는 일이 정말로 나쁜 생각일지도 모른다는 생각이 들었다. 다음은 일종의 추상적 인 예입니다. 요점은 벡터를 기준으로 전달하는 것입니다. 임시 객체를 인자로 갖는 C++ 객체 생성자

// vector.hpp 
class vector { 
    vector(double x, double y, double z); 
} 

// particle.hpp 
class particle { 
    particle(const vector& _init_position); 
    vector m_position; 
} 

그래서 나는 3D 벡터 재료를 포함하는 class vector을 대표하는 몇 가지 코드를 작성했습니다, 또한 생성자와 벡터 인스턴스로 초기화 할 수있는 위치 벡터있는 입자 클래스를 작성했습니다. 내 main() 기능에

, 나는, 입자 객체를 초기화과 같이하는 임시 객체를 사용했다 :

여기
int main() { 

    particle my_particle(vector(0.0, 1.0, 2.0)); // Temp vector instance - problem? 
} 

임시 벡터 인스턴스가 생성되는 것을 볼 수있다, 나는 그것이 스택에 배치됩니다 가정 어딘가에, 그리고 입자의 생성자가 호출됩니다.

괜찮습니까? 아니면 아주 나쁜 코드입니까? 나는 참조로 지나가고 있기 때문에 후자가 의심 스럽다. 따라서 임시 벡터의 인스턴스가 유효하지 않을 수도있다.

누군가이 사실을 분명히 알 수 있기를 바랍니다.

+0

rval 참조 – aaronman

+1

에서 읽어야합니다. 완벽하게 정상입니다. 항상 발생합니다. 예를 들어''Hello std :: string &' –

+0

@IgorTandetnikArgh를 가진 함수에''Hello "'를 넘길 때마다, 그 예제를 생각해 보았을 것입니다! – user3728501

답변

1

임시 개체를 값 또는 const 참조 매개 변수로 함수에 전달할 수 있습니다. const 참조를 전달할 때 사본을 저장할 수 있기 때문에 좋은 일입니다.

+0

왜 const 참조가되어야합니까? const가 없으면 컴파일되지 않을 것입니다. – user3728501

+0

@EdwardBird 기술적 인 이유가 없습니다 (Visual Studio에서 확장 기능으로 지원하므로), 허용되지 않습니다. 나는 그들이 나쁜 코딩 방법을 장려 할 것이라고 생각했다. –

+0

그건 충분히 공평합니다. 모든 것은 const와 모든 것이어야합니다. – user3728501

1

벡터 생성자의 구현을 표시하지 않지만 멤버는 값이므로 생성자가 해당 인수를 멤버에 복사한다고 가정합니다. 그렇다면 const ref를 전달하는 것이 불필요한 사본을 피하기 위해하고 싶은 일과 똑같습니다.

원하지 않는 것은 해당 인수에 대한 참조 (또는 주소)를 보류하는 것입니다.