해결된 질문
작성
·
7
0
30강 19분에서
TestData result = testFunc( 10); 에서 10은 리터럴 상수인데, TestData 객체로 변환될 때 값이 아닌 상수형 참조로 처리되는 건가요? 상수형 참조로 처리되기 때문에 컴파일러가 내부적으로 TestData(10) 라는 임시 객체를 생성해서 그 객체를 testFunc() 의 인자로 넘기는 과정이 맞는 건지 헷갈립니다..!
답변 2
0
testFunc() 함수가 반환하는 자료형이 TestData 클래스라면 testFunc() 함수 호출의 결과로 TestData 클래스 인스턴스가 생성되며 이는 임시객체에 해당합니다. 이 임시객체를 원본으로 result 인스턴스가 만들어집니다.
임시객체가 만들어지는 경우는 operator+() 연산자 같은 것을 정의하거나 함수의 반환형으로 클래스 인스턴스가 넘어오는 경우입니다. 두 경우 모두 r-value 참조가 적용됩니다. 만일 TestData 클래스가 int형 자료 하나를 매개변수로 갖는 생성자가 존재하고 testFunc() 함수의 원형이 testFunc(TastData param) 같은 형식이라면 testFunc(10) 호출이 testFunc(TestData(10))으로 처리될 수 있습니다. 이 경우 TestData(int) 생성자가 호출될 수 있는데 이를 묵시적 생성이라 합니다.
그리고 생각하시는 것처럼 결국 모든 것은 컴파일러 최적화에 따라 객체가 생성되지 않고 사라질 수도 있습니다. 이는 전적으로 컴파일러 최적화 규칙에 따릅니다.
조금 복잡하긴 하지요. 안타깝게도 문법을 이해하는 것 외에 다른 대안이 없습니다. 참고하시기 바랍니다.
0
안녕하세요, 인프런 AI 인턴입니다.
귤귤님께서 질문하신 임시 객체와 복사 생성자 관련 내용을 이해하기 위해 중요한 개념은 C++에서 함수 인자로 전달될 때 상수형 참조가 어떻게 작동하는지입니다. TestData result = testFunc(10);
에서 이 코드에서 10
이라는 리터럴 상수가 TestData
객체로 변환되며 상수형 참조를 통한 변환 생성과정에 대해 질문을 주셨네요.
C++에서는 10
과 같은 리터럴을 함수에 전달할 때, 상수형 참조(const reference)를 사용할 경우 바로 전달이 가능합니다. 함수 testFunc
의 매개변수가 const TestData&
처럼 정의되어 있다면, 컴파일러는 10
을 TestData
객체로 자동 변환하고 그 임시 객체에 상수형 참조를 통해 접근합니다. 상수형 참조는 이렇게 임시 객체에 안전하게 접근할 수 있도록 해주며, 이 과정에서 복사 생성자가 호출되지 않고 임시 객체가 생성되어 동일한 수명을 가집니다.
더 나아가 참고할 만한 기존의 질문과 답변이 있습니다. 다음 링크에서 const 참조에 관해 다루고 있습니다:
- 임시 객체와 보이지 않는 복사 생성 관련 질문
- 일반 참조형과 const 참조형에 따라 컴파일 오류가 발생하거나 발생하지 않는 이유가 궁금합니다.
각각의 링크에서는 const 참조의 사용에 관한 C++의 규칙과 상수형 참조의 동작에 대해 설명하고 있으니 참고하시기 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.