c++ 변환 생성자에 대해 질문이 있습니당
글쓴이: 으네이 / 작성시간: 일, 2017/10/22 - 2:13오후
일단 제가 알기론 변환 생성자란 매게변수가 한 개인 생성자를 변환 생성자라고 부르고
형변환이 가능하다 이런식으로 이해하고 있습니당.
만약 예를 들어서
class Test { Test (int n) { } } int main() { Test T = 3; }
이런 식으로 작성을 하면....
1. T와 3이 메모리에 저장이 돼고 컴파일러가 T와 3이 형식이 같은지 확인한다.
2. 3은 정수고 T는 Test 이므로 형식이 다름을 안 컴파일러는 다음을 수행한다.
3. 형변환 생성자를 이용해 먼저 Test형 임시객체를 만든 후, 3을 대입한다.
4. 최종적으로 T에 만든 임시객체를 대입한다.
질문 : 이런식으로 진행돼는게 맞나요? 맞다면.. 다음 소스를 보면
#include <iostream> using namespace std; class Test { public: int a; Test() { printf("디폴트 생성자 호출\n"); } Test(int n) { printf("형변환 생성자 호출\n"); } Test(const Test &T) { printf("복사 생성자 호출\n"); } ~Test() { printf("소멸자 호출\n"); } }; int main() { Test T = 300; }
------ 출력 결과 ------
형변환 생성자 호출
소멸자 호출
----------------------
이런 식으로 출력이 되었어용 ㅠㅠ
제 생각에는
형변환 생성자 호출 // 임시객체에 3을 형변환 생성자로 대입
복사 생성자 호출 // T에 만든 임시객체 대입
소멸자 호출 // 만든 임시객체 소멸
소멸자 호출 // T 소멸
이런식으로 나와야할것 같아서요.. ㅠㅠ 고수님들 좀 알려주세용 ㅠ
Forums:
질문자님의 해석이 원론적으로는 맞습니다. 그러나 출력
질문자님의 해석이 원론적으로는 맞습니다. 그러나 출력 결과 역시 틀리지 않습니다.
이러한 결과는 컴파일러가 copy elision이라는 최적화를 수행했기 때문입니다.
copy elision이 무엇인지에 대해서는 제가 조금 다른 질문에서 상세히 답을 드린 적이 있습니다.
https://kldp.org/node/158078
감사용
이 부분에 대해서 궁금한게 있습니당
------------------
위에서 보시면 아시겠지만 temporary는 그저 중간과정에 존재할 뿐 딱히 의미가 없습니다. 애초에 주어진 초기값으로 temporary 객체를 만들 수 있었다면, 그냥 a를 바로 만들 수도 있었겠지요. C++ 표준에서는 이런 식의 의미 없는 temporary의 생성과 소멸을 컴파일러가 재량껏 생략해 버릴 수 있도록 허용하고 있습니다. 바로 copy elision이라고 부르는 최적화입니다.
거의 모든 현대 C++ 컴파일러가 위 최적화를 지원하기 때문에, 질문자님의 코드 MyString str = "My String object";는 temporary의 생성을 거치지 않고 str에다가 바로 const char *를 받는 생성자를 호출하게 됩니다. 즉 direct-initialization과 똑같이 실행되는 것이죠.
----------------------------
원리적으로 제 해석대로 진행해야하지만 컴파일러의 최적화때문에
결국 생성자 하나로 끝난다 이 말씀인가요?
그럼 이 두 문장의 차이는 없는건가요?
Test T = 500;
Test T(500);
감사용
감사합니당 ㅎㅎ
댓글 달기