본문 바로가기
프로그래밍 언어/C++

[C++] 변환 연산자 conversion operator

by 까망 하르방 2025. 3. 11.
반응형

변환 연산자란 (conversion operator)

• 사용자 정의 타입을 다른 타입으로 변환할 때 사용하는 멤버 함수

• 반환 타입 명시 X

•  primitive 타입과의 호환성 유지

 


[예제] 변환 연산자 필요성

#include <iostream>

class Tcp
{
	bool state = false;
public:
	void connect()
	{
		state = true;
	}

	bool isConnect()
	{
		return state;
	}
};

int main()
{
	Tcp tcp;
	tcp.connect();

	if ( tcp.isConnect() )
	{
		printf("접속 완료");
	}
}

 

 

Q) 객체 유효성을 if 문으로 조사하려면?
A) 객체가 bool 타입으로 변환되어야 한다.
 → 변환 연산자 (= 객체가 다른 타입으로 변환이 필요할 때 호출되는 함수)

#include <iostream>

class Tcp
{
	bool state = false;
public:
	void connect()
	{
		state = true;
	}
};

int main()
{
	Tcp tcp;
	tcp.connect();

	if ( tcp ) // ??
	{
		printf("접속 완료");
	}
}



[예제] 변환 연산자 적용

#include <iostream>

class Tcp
{
	bool state = false;
public:
	void connect()
	{
		state = true;
	}

	operator bool() const
	{
		return state;
	}
};

int main()
{
	Tcp tcp;
	tcp.connect();

	if ( tcp ) // tcp.operator bool()
	{
		printf("접속 완료");
	}
}



변환 연산자 특징

• 객체가 다른 타입으로 변환 될 때 호출
• 반환 타입을 표기하지 않는다. (함수 이름 자체에 반환 타입 포함)
• 객체 변환은 의도하지 않은 동작을 일으킬 수 있으므로 explicit 붙이는 것이 좋다.

 

 

[예제] explict 사용하지 않는 경우

복사 초기화, 암시적 변환 허용하게 되어 의도치 않은 동작 할 수 있음

#include <iostream>

class Tcp
{
	bool state = false;
public:
	void connect()
	{
		state = true;
	}

	operator bool() const
	{
		return state;
	}
};

void foo(bool b) {}

int main()
{
	Tcp tcp;

	bool b1 = tcp;	// ?? -> ok (복사 초기화)
	
	bool b2(tcp);	// ?? -> ok (직접 초기화)
	
	bool b3 = static_cast<bool>(tcp); // ?? -> ok

	foo(tcp);	// ?? -> ok
	
	tcp << 5;	// ?? -> ok
	
	if (tcp) {}	// ?? -> ok	
}



[예제] explict 적용

• 직접 초기화와 명시적 변환만 허용
• 암시적 변환 허용 X
• if 조건식 안에서는 사용 가능

#include <iostream>

class Tcp
{
	bool state = false;
public:
	void connect()
	{
		state = true;
	}

	explicit operator bool() const
	{
		return state;
	}
};

void foo(bool b) {}

int main()
{
	Tcp tcp;

	bool b1 = tcp;	// ?? -> error (복사 초기화)
	
	bool b2(tcp);	// ?? -> ok (직접 초기화)
	
	bool b3 = static_cast<bool>(tcp); // ?? -> ok

	foo(tcp);	// ?? -> error
	
	tcp << 5;	// ?? -> error
	
	if (tcp) {}	// ?? -> ok	
}

 

 

📌 [C++] explicit 키워드

 

[C++] explicit 키워드

explicit 키워드는 묵시적 형변환을 할 수 없게 만들고 명시적인 형변환만 가능하도록 만드는 것이다. 주로 생성자에 explict를 활용한다. why? 의도하지 않은 오류를 방지하기 위함이다. = 원하지 않

zoosso.tistory.com

 

📌 [C++] 연산자 재정의 (Operator Overloading)

 

[C++] 연산자 재정의 (Operator Overloading)

연산자 재정의 (Operator Overloading)사용자 정의 타입에서 +, - 등 연산자 사용할 수 있는 문법class Point{ int x = 0; int y = 0;public: Point() = default; Point(int x, int y) : x{ x }, y{ y } {}};int main(){ Point p1{ 1, 1 }; Point

zoosso.tistory.com

 

📌 [C++] 상수 멤버함수 const member function

 

[C++] 상수 멤버함수 const member function

상수 멤버 함수 (const member function)• 컴파일러에게 상수 멤버 함수인 것을 알게 해주는 것• 멤버 함수의 괄호() 뒤쪽에 const 키워드 사용 함수 선언과 구현으로 분리하는 경우 양쪽에 모두 붙인

zoosso.tistory.com

반응형

댓글