C++에서 static_cast 명령 사용
이 기사에서는 C++에서static_cast
를 사용하는 방법에 대한 여러 가지 방법을 보여줍니다.
static_cast
를 사용하여 C++에서 객체 유형을 명시 적으로 변환
객체를 다른 유형으로 변환하는 작업을캐스팅
이라고합니다. 언어 규칙에 따라 C++에서 암시 적 변환이 발생하는 경우가 있습니다 (예 : 배열에서 포인터로의 붕괴). 그러나 캐스팅은 주로 사용자가 만드는 명시 적 변환 요청과 관련이 있습니다. 객체 또는 표현식의 값을 다른 유형으로 캐스트 할 때 컴파일러가 주어진 유형을 객체를 가리키는 포인터에 연결하도록합니다.
명명 된 명시 적 캐스트 작업에는const_cast
,static_cast
,reinterpret_cast
및dynamic_cast
가 있습니다. 이러한 작업은 최신 C++ 언어에 고유하며 이전 C 스타일 캐스트보다 상대적으로 읽기 쉽습니다. 캐스트는 종종 위험하며 숙련 된 프로그래머조차도 실수를하지만 필요한 경우 이러한 변환 작업을 사용하지 않도록주의해야합니다. 이 기사에서는static_cast
및reinterpret_cast
작업에 대해서만 개괄적으로 설명합니다.
static_cast
함수는 일반적으로 관련 유형을 동일한 클래스 계층 또는 숫자 유형의 포인터로 서로 변환하는 데 사용됩니다. 이 명령은 생성자와 변환 연산자에 의해 정의 된 변환도 처리합니다. main
함수의 두 번째 행은 본질적으로 부호있는char
에서 부호있는 정수로 암시 적 캐스트를 수행합니다. 이는 다음 행의 가려진 버전의 일부에 불과합니다.
결과가 동일하더라도 최신 C++에서 캐스팅을 수행하는 데 권장되는 방법입니다. 반면에main
함수의 네 번째 및 다섯 번째 줄은static_cast
연산을 사용하는 유효한 변환이 아닙니다. 그러나 C 스타일 캐스트(int*)x
를 사용하여 후자의 변환을 강제 할 수 있습니다. 이는 16 진수 형식 및 메모리 주소 표기법으로97
정수 값을 인쇄합니다. 이 작업은 대부분 컴파일러 경고를 생성합니다.
#include <iostream>
using std::cout;
using std::endl;
int main() {
char x = 'a';
int x_i = x;
int x_ii = static_cast<int>(x);
int* x_iii = static_cast<int*>(x); // ERROR
int* x_iii = static_cast<int*>(&x); // ERROR
int* x_iii = (int*)x; // WARNING
cout << x << endl;
cout << x_i << endl;
cout << x_ii << endl;
cout << x_iii << endl;
return EXIT_SUCCESS;
}
출력:
a
97
97
0x61
0x7ffeb7c31997
reinterpret_cast
를 사용하여 C++에서 객체 유형을 명시 적으로 변환
또는 다음 코드 예제에 표시된reinterpret_cast
작업을 사용하여 후자의 C 스타일 캐스트를 수행 할 수 있습니다. 이 메서드는 컴파일러 경고를 음소거하고 사용자가 변환에 대한 책임을 져야합니다. char*
와 같은reinterpret_cast
를 사용하여 다른 포인터 유형을int*
로 변환 할 수 있습니다.
이 경우 인쇄 된 주소는x
문자가 저장된 주소와 동일합니다. 값에 액세스하기 위해x_iii
포인터를 역 참조하면a
또는 해당 ASCII 대체 문자가 아니라 이상한 정수를 얻을 수 있습니다. 이 정수는 동일한 위치에서 검색됩니다. int
로 해석되므로 데이터 유형의 크기 만 다릅니다.
#include <iostream>
using std::cout;
using std::endl;
int main() {
char x = 'a';
int* x_i = (int*)x; // WARNING
int* x_ii = reinterpret_cast<int*>(x);
int* x_iii = reinterpret_cast<int*>(&x);
cout << x_i << endl;
cout << x_ii << endl;
cout << x_iii << endl;
return EXIT_SUCCESS;
}
출력:
0x61
0x61
0x7ffca18be95f
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook