42seoul/projects

[C++] casts

moaoh 2024. 3. 13. 15:14

C++ casts

c++μ—λŠ” λ‹€μ–‘ν•œ ν˜• λ³€ν™˜ μ—°μ‚°μž(λ˜λŠ” 캐슀트 μ—°μ‚°μž)κ°€ μžˆλ‹€.

  • static_cast
  • reinterpret_cast
  • dynamic_cast
  • const_cast

μœ„μ™€ 같이 크게 4κ°€μ§€μ˜ cast듀이 μ‘΄μž¬ν•œλ‹€.


static_cast

κ°€μž₯ 일반적인 ν˜• λ³€ν™˜ μ—°μ‚°μžλ‘œ, 컴파일 μ‹œκ°„μ— μ•ˆμ „ν•œ ν˜• λ³€ν™˜μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž… 검사λ₯Ό μˆ˜ν–‰ν•˜λ©°, μ•ˆμ „ν•˜μ§€ μ•Šμ€ ν˜• λ³€ν™˜μ„ λ°©μ§€ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 데이터 손싀을 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

#include <iostream>

int	main() {
	double d = 3.14;
	int i = static_cast<int>(d); // double을 int둜 λ³€ν™˜
	std::cout << "i : " << i;
	return (0);
}
// output
// i : 3%

reinterpret_cast

주둜 μ£Όμ†Œλ‚˜ 포인터 등을 λ‹€λ₯Έ ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•  λ•Œ μ‚¬μš©λœλ‹€.

#include <iostream>

int	main() {
	int x = 42;
	double* y = reinterpret_cast<double*>(&x); // int μ£Όμ†Œλ₯Ό double ν¬μΈν„°λ‘œ λ³€ν™˜
	int z = x;
	std::cout << "z : " << z;
	return (0);
}
// output
// z : 42

dynamic_cast

주둜 상속 관계가 μžˆλŠ” ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©λ˜λ©°, 주둜 λ‹€ν˜•μ„±(polymorphism)κ³Ό ν•¨κ»˜ μ‚¬μš©λ˜λŠ” cast

Base* basePtr = new Derived;
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr) {
    // μ„±κ³΅μ μœΌλ‘œ ν˜• λ³€ν™˜
}

const_cast

const ν•œμ •μžλ₯Ό μ œκ±°ν•˜κ±°λ‚˜ μΆ”κ°€ν•˜λŠ” 데 μ‚¬μš©

const int x = 42;
int* y = const_cast<int*>(&x); // constλ₯Ό μ œκ±°ν•˜μ—¬ μˆ˜μ • κ°€λŠ₯ν•œ ν¬μΈν„°λ‘œ λ³€ν™˜