C++에서 static_cast 명령 사용

Jinku Hu 2023년10월12일
  1. static_cast를 사용하여 C++에서 객체 유형을 명시 적으로 변환
  2. reinterpret_cast를 사용하여 C++에서 객체 유형을 명시 적으로 변환
C++에서 static_cast 명령 사용

이 기사에서는 C++에서static_cast를 사용하는 방법에 대한 여러 가지 방법을 보여줍니다.

static_cast를 사용하여 C++에서 객체 유형을 명시 적으로 변환

객체를 다른 유형으로 변환하는 작업을캐스팅이라고합니다. 언어 규칙에 따라 C++에서 암시 적 변환이 발생하는 경우가 있습니다 (예 : 배열에서 포인터로의 붕괴). 그러나 캐스팅은 주로 사용자가 만드는 명시 적 변환 요청과 관련이 있습니다. 객체 또는 표현식의 값을 다른 유형으로 캐스트 할 때 컴파일러가 주어진 유형을 객체를 가리키는 포인터에 연결하도록합니다.

명명 된 명시 적 캐스트 작업에는const_cast,static_cast,reinterpret_castdynamic_cast가 있습니다. 이러한 작업은 최신 C++ 언어에 고유하며 이전 C 스타일 캐스트보다 상대적으로 읽기 쉽습니다. 캐스트는 종종 위험하며 숙련 된 프로그래머조차도 실수를하지만 필요한 경우 이러한 변환 작업을 사용하지 않도록주의해야합니다. 이 기사에서는static_castreinterpret_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
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C++ Cast