형 변환 생성자와 캐스팅
#include <iostream>
using namespace std;
class Knight
{
public:
Knight()
{
cout << "[알림] 기본 생성자 호출" << endl;
this->hp = 10;
this->mp = 10;
}
Knight(int hp)
{
cout << "[알림] 타입 변환 생성자 호출" << endl;
this->hp += hp;
}
~Knight()
{
cout << "[알림] 소멸자 호출" << endl;
}
void print()
{
cout << "[정보] HP: " << this->hp << " MP: " << this->mp << endl;
}
public:
int hp;
int mp;
};
int main()
{
// 1. 기본 자료형 형 변환 연산자 사용
// a의 값에 대해 형 변환 '연산자'를 사용하여 형 변환된 결과를 반환 후 b에 할당
int a = 3;
double b = (double)a;
// 2. 객체형에 대한 형 변환 생성자 사용
// (1) 기본적인 타입 변환 연산자 호출 순서 : 타입->소멸
Knight k1(5);
k1.print();
// (2) 묵시적 타입 변환 연산자 호출 순서 : 타입->소멸
Knight k2 = 10;
k2.print();
// (3) 기본 생성자로 생성 후 묵시적 타입 변환 연산자 호출하여 재할당 순서 : 기본->타입->소멸->소멸
Knight k3;
k3 = 10;
k3.print();
return 0;
}[1]의 상황 - 이해하였습니다.
해당하는 기본 자료형의 경우 단항 연산자인 "형 변환 연산자"에 의해 연산된 결과가 반환되어 double형 변수 b에 정상 할당되었습니다.
[2-1]의 상황 - 이해하였습니다.
오버로딩된 기본 연산자 중 인수가 하나인 타입 변환 생성자가 자동으로 호출되어 객체가 생성되었습니다.
[질문 항목]
Q1.
[2-2] [2-3]의 상황 - 헷갈립니다.
묵시적으로 형 변환 타입 생성자가 호출되어 우항의 Knight(10)이 우선 동작하고 그 결과가 반환되어 k2에 할당되었다라고 생각하였는데 실제 어셈블리로 동작을 확인하니 예상했던 순서로 동작하지 않고 바로 타입 변환 연산자가 호출되어 [2-1]과 [2-2]는 완전히 같았습니다. 기본 자료형에 대한 casting 처럼 캐스팅이 먼저 동작되고 그 결과가 반환되어 좌항에 할당된다고 생각했습니다. 그런데 반환형이 없는 생성자인데 대입 연산자 기준 우측에서 사용될 수 있었던건 의미만 캐스팅일 뿐, 실제로는 형 변환 연산자의 호출의 다른 방법이기 때문인가요? (실제로는 타입 변환이 아닌 인수가 1개인 기본 생성자 호출인데 사용 방법이 마치 형 변환과 같아서 이름이 그렇게 붙은건가요?)
복잡하게 생각하지 않는다면,
타입 변환 생성자는 1) 그 자체로 생성자로 활용 2) 캐스팅의 두 가지 사용처가 있고 1), 2) 모두 내부적으로 같은 방식으로 동작함.
이라고 이해해도 괜찮을까요?
바로 전에 작성한 질문은 생각을 제대로 정리하지 못해 글이 난해하여 다시 정리하여 올리게 되었습니다.
좋은 강의 감사드립니다.
정말 많이 배우고있고 큰 도움이 되고 있습니다.
답변 1
소스코드와 관련하여 질문드립니다
0
70
1
map 컨테이너의 emplace 함수에 대해
0
114
2
시작이 안되네요...!
0
97
2
EAX 명령어 실행 시 RAX의 상위 32비트가 초기화 되는 이유
0
126
1
리틀 엔디안 장점 질문합니다.
0
131
1
메모리 창에 주소를 넣었는데 영어 꺠짐
0
124
1
타입변환#2 build시 knight 인접 stack이 침범당했다는 error가 발생합니다.
0
94
2
map #1 8분 58초 맵은 레드블랙트리로 이루어진 것 같습니다.
1
139
2
hello world 부터 오류 ㅠㅜ
0
189
1
지역변수가 스택? 레지스터
0
132
2
마지막 문제 질문드립니다.
0
165
2
메모리창이 비활성화됩니다.
0
98
1
이중포인터 강좌 부분 질문있습니다.
0
145
1
2를 더하는 이유
0
133
1
메모리 주소 창 엔디안 질문 드립니다. 인프런 봇 답변도 괜찮습니다
1
111
1
해당 코드는 왜 오류가 날까요?
0
155
1
마지막 문제 질문 있습니다.
0
119
1
강의 마지막부분에 질문이 있습니다.
0
192
2
Field초기화
0
141
1
virtual과 override 차이
0
315
2
3:30 참조자 리턴
0
168
1
map 찾기
0
158
1
프로그램 질문드려요
0
260
1
캐스팅 질문
0
138
1





