• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

형 변환 생성자와 캐스팅

23.07.11 14:03 작성 23.07.11 14:16 수정 조회수 220

0

#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

타입 변환 생성자의 사용처가 캐스팅이라기 보다는,
그냥 C++의 이상한 문법 때문에 결과론적으로 그렇게 된 것에 가깝습니다.
사실 변환을 담당하는 operator는 나중에 또 따로 나옵니다.

Knight k2 = 10; 이것과 Knight k2; k2 = 10;
이 차이 또한 [int생성자] vs [기본생성+대입]의 차이라서
그냥 받아들일 수밖에 없습니다.

잇택잇님의 프로필

잇택잇

질문자

2023.07.12

감사합니다.

이해하기가 조금 어려웠는데 받아들이는 쪽이 더 자연스러운 것 같습니다.

그저 객체 생성 방법의 방법들이라고 생각하겠습니다!