type conversions c
C ++에서 지원되는 다양한 유형 변환을 확인하십시오.
이전 튜토리얼에서 C ++에서 사용할 수있는 모든 데이터 유형을 알고 있어야합니다. 때로는 한 유형을 다른 유형으로 변환해야하는 필요성이 발생할 수 있습니다. 이를 유형 변환 또는 유형 캐스팅이라고합니다.
이 튜토리얼에서는 C ++에서 지원되는 다양한 유형 변환에 대해 설명합니다.
C ++로 작성된 소프트웨어
=> 무료 C ++ 과정을 보려면 여기를 클릭하십시오.
학습 내용 :
유형 변환
C ++는 두 가지 유형의 변환을 지원합니다.
- 암시 적 유형 변환 : 암시 적 형식 변환은 자동입니다. 이러한 유형의 변환에는 사용자의 간섭이 없으며 컴파일러가 직접 변환을 수행합니다. 변환은 일반적으로 표현식에 둘 이상의 데이터 유형이있을 때 수행됩니다. 그러나 일반적으로 이러한 유형의 변환에서는 데이터 손실, 신호 손실 또는 데이터 오버플로의 가능성이 있습니다.
- 명시 적 유형 변환 : 명시 적 유형 변환은 사용자 정의이며 일반적으로 '유형 캐스팅'이라고합니다. 여기서 사용자는 요구 사항에 따라 한 데이터 유형의 값을 다른 유형으로 캐스트하거나 변환합니다. 이러한 유형의 변환이 더 안전합니다.
이제 두 유형의 유형 변환을 자세히 살펴 보겠습니다.
암시 적 변환
암시 적 변환에서 컴파일러는 표현식에 둘 이상의 데이터 유형이있을 때마다 한 데이터 유형에서 다른 데이터 유형으로 변환을 수행합니다. 데이터 손실을 방지하기 위해 다른 데이터 유형의 모든 변수는 가장 큰 데이터 유형으로 변환됩니다. 이것을 승진이라고합니다.
코드 예제를 사용하여 암시 적 변환을 이해하겠습니다.
#include using namespace std; int main() { int num = 10; char ch = 'A'; cout<<'10 + 'A' = '< 산출:
10 + 'A'= 75
float val (10 +‘a ') = 107
var_int = 1000
위의 코드 예제는 암시 적 변환을 보여줍니다. 우리는 각각 값이 10과 'A'인 정수와 문자 변수를 선언했습니다. 이 두 변수를 더하면 암시 적 변환이 발생합니다.
정수가이 표현식에서 더 큰 유형이므로 문자 변수 값 'A'는 해당 정수 즉, 값 65 (ASCII 값)로 변환됩니다. 따라서 표현식의 결과는 75입니다.
다음 표현식에서 정수와 문자 (‘a’-> 97)를 추가 한 다음 결과를 float에 할당합니다. 따라서 표현식의 결과는 컴파일러에 의해 암시 적으로 float로 변환됩니다.
세 번째 표현식에서 짧은 int 변수는 암시 적으로 정수로 변환됩니다.
노트 : 암시 적 변환의 경우 컴파일러가 잠재적 인 데이터 손실을 감지하면이 영향에 대한 경고를 표시 할 수 있습니다.
명시 적 변환
명시 적 변환은 한 데이터 유형을 다른 데이터 유형으로 '캐스트'하므로 '유형 캐스팅'이라고도합니다. 여기서는 컴파일러가 내부적으로 변환을 수행하는 암시 적 변환과 달리 사용자가 캐스팅을 명시 적으로 정의합니다.
두 가지 방법으로 명시 적 변환을 수행 할 수 있습니다.
# 1) 할당 연산자 사용
할당 연산자를 사용하는 명시 적 변환 또는 형변환은 강제로 수행됩니다. 여기서는 할당 연산자를 사용하여 하나의 데이터 유형을 다른 데이터 유형으로 캐스트하거나 변환합니다.
일반적인 구문은 다음과 같습니다.
(data type) expression;
다음 예에서 이에 대해 설명합니다.
#include #include using namespace std; int main() { int sum; double salary = 4563.75; sum = (int)salary + 1000; cout<<'Sum = '< 산출:
합계 = 5563
Comp = 5563.2
위의 예에서 할당 연산자를 사용하여 명시 적 캐스팅을 보여주었습니다. 먼저, double 유형의 변수 급여를 정수 유형으로 캐스트합니다. 다음으로 정수 변수 합계를 이중 유형으로 캐스트합니다.
출력에서 볼 수 있듯이 우리가 캐스트하는 유형은 표현식 결과의 최종 유형을 나타냅니다.
사용자가 요구 사항에 따라 표현 유형을 변경할 수 있으므로 유리합니다.
# 2) 캐스트 연산자 사용
이 유형의 캐스트에서는 한 유형에서 다른 유형으로 변경하는 단항 연산자 인 '캐스트 연산자'를 사용합니다.
주조 유형
사용하는 캐스트 연산자에 따라 다음 유형의 캐스트가 있습니다.
# 1) 정적 캐스트
정적 형변환은 형변환 연산자를 사용하는 모든 형변환 중에서 가장 간단합니다. . 정적 캐스트는 암시 적으로 수행되는 모든 변환을 수행 할 수 있습니다. 또한 서로 관련된 클래스의 포인터간에 변환을 수행합니다 (업 캐스트-> 파생에서베이스로 또는 다운 캐스트->베이스에서 파생으로).
위에 나열된 변환 외에도 정적 캐스트는 포인터를 void *로 변환 할 수도 있습니다.
정적 캐스트는 컴파일 된 시간 캐스트입니다. 이는 수행 된 캐스트가 유효한지 여부를 확인하기 위해 런타임에 확인되지 않음을 의미합니다. 따라서 변환이 안전하고 유효한지 확인하는 것은 프로그래머의 책임입니다.
즉, 사용자는 변환 된 개체가 대상 데이터 유형과 관련하여 가득 차 있는지 확인해야합니다.
다음과 같이 정적 캐스트를 지정합니다.
static_cast (expression)
예제를 사용하여 정적 캐스트를 이해합시다.
#include using namespace std; int main() { double df = 3.5 * 3.5 * 3.5; cout<<'Before casting: df = '<위의 예에서는 값이 'A'인 문자 변수를 포함하도록 코드를 약간 수정했습니다. 그런 다음 정수 포인터를 선언하고 정적 캐스트를 적용하여 문자를 정수 포인터로 변환합니다.
이 프로그램을 컴파일하면 다음과 같은 결과가 나옵니다.
'int main ()'함수에서 :
10:35 : 오류 :‘char *’유형에서‘int *’유형으로의 잘못된 static_cast
프로그램은 유효하지 않기 때문에 수행 된 정적 캐스트에 대해 오류를 제공합니다. 따라서 정적 형변환은 유효한 형변환 또는 변환만을 허용하고 우리가 원하지 않는 형변환을 수행하려고 할 때 오류를 발생시킵니다.
# 2) 다이내믹 캐스트
동적 캐스트는 캐스트의 유효성을 확인하기 위해 수행되는 런타임 캐스트입니다. 동적 캐스트는 클래스 포인터 및 참조에서만 수행됩니다. 캐스트가 실패하면 표현식은 NULL 값을 반환합니다.
동적 캐스트는 다음과 같은 메커니즘을 사용합니다. RTTI (런타임 유형 식별) . RTTI는 객체의 데이터 유형에 대한 모든 정보를 런타임에 사용할 수 있도록하며 하나 이상의 가상 함수 (다형성 유형)가있는 클래스에서만 사용할 수 있습니다. RTTI를 사용하면 런타임 또는 실행시 개체 유형을 결정할 수 있습니다.
Dynamic cast를 이해하기 위해 하나의 예제를 시도해 보겠습니다.
#include #include using namespace std; class base {public: virtual void print(){}}; class derived:public base{}; int main() { base* b = new derived; derived* d = dynamic_cast(b); if(d != NULL) cout<<'Dynamic_cast done successfully'; else cout<<'Dynamic_cast not successful'; }
이 프로그램에서 우리는 가상 함수가있는 base와 기본 클래스 인 base를 갖는 파생 된 두 개의 클래스를 정의했습니다.
주 함수에서 기본 클래스 포인터가 가리키는 파생 클래스 개체를 만듭니다. 그런 다음 파생 클래스를 가리키는 기본 포인터에서 dynamic_cast를 수행하여 파생 클래스 포인터로 캐스팅합니다.
기본 클래스에서와 같이 기본은 다형성 (가상 기능 포함)이고 dynamic_cast는 성공합니다.
노트 : 위 클래스에서 가상 기능을 제거하면 객체에 대한 RTTI 정보를 사용할 수 없으므로 dynamic_cast가 실패합니다.
동적 캐스트에는 런타임시 유형 안전성 오버 헤드가 있습니다.
메이크 파일 C ++ 만드는 방법
# 3) 캐스트 재 해석
이 유형의 캐스트는 클래스가 서로 관련되지 않은 상태에서 모든 유형의 객체에서 작동하므로 사용하기에 가장 위험합니다.
Reintepret_cast는 모든 포인터에서 작동하며 포인터가 서로 관련되어 있는지 여부에 관계없이 모든 유형의 포인터를 다른 유형으로 변환합니다. 포인터 또는 포인터가 가리키는 데이터가 같은지 확인하지 않습니다.
캐스트 연산자는 변환 할 소스 포인터 인 하나의 매개 변수 만 사용하며 값을 리턴하지 않습니다. 단순히 포인터 유형을 변환합니다.
필요한 경우가 아니면 사용하지 마십시오. 일반적으로 소스 포인터를 원래 유형으로 형변환합니다.
우리는 주로 비트 작업에 사용합니다. 부울 값에를 사용하면 부울 값이 정수 값으로 변환됩니다. 즉, 1은 true이고 0은 false입니다.
재 해석 캐스트의 예를 살펴 보겠습니다.
#include using namespace std; int main() { int* ptr = new int(97); char* ch = reinterpret_cast(ptr); cout << ptr << endl; cout << ch << endl; cout << *ptr << endl; cout << *ch << endl; return 0; }
산출:
0x3ef3090
...에
97
...에
위의 예에서 값 97을 가리키는 정수 포인터 ptr을 선언했습니다. 다음으로 문자 포인터 ch를 선언하고.
다음으로 다양한 값을 인쇄합니다. 첫 번째로 인쇄하는 것은 정수 위치를 가리키는 ptr입니다. 따라서 주소를 인쇄합니다.
다음 값 ch는 값 97을 포함하므로 97에 해당하는 ASCII 값인 'a'를 인쇄합니다. 다음 값 '* ptr'은 97에 해당하는 ASCII 값을 보유하는 반면 '* ch'는 다음을 사용하여 캐스트 할 때 'a'와 동일한 ASCII 값을 보유합니다. reinterpret_cast.
# 4) Const Cast
캐스트 연산자는 소스 포인터의 상수를 변경하거나 조작하는 데 사용됩니다. 조작에 의해 constness를 비 상수 포인터로 설정하거나 const 포인터에서 constness를 제거 할 수 있습니다.
연산자를 성공적으로 캐스트하기위한 조건은 캐스트되는 포인터와 소스가 동일한 유형이어야한다는 것입니다.
이것을 이해하기 위해 예를 들어 보겠습니다.
#include using namespace std; int printVal(int* ptr) { return(*ptr*10); } int main(void) { const int value = 10; const int *ptr = &value; int *ptr_cast = const_cast (ptr); cout <<'printVal returned = '<< printVal(ptr_cast); return 0; }
이 예에서 'printVal'함수가 상수가 아닌 포인터를 받아들이는 것을 볼 수 있습니다. 주 함수에는 const 포인터 ptr에 할당 된 const 변수 'value'가 있습니다.
이 const 포인터를 printVal 함수에 전달하려면 constness를 제거하기 위해 적용하여 캐스팅합니다. 그런 다음 포인터 ptr_cast를 함수에 전달하여 원하는 결과를 얻습니다.
결론
이것으로 우리는 C ++에서 타입 변환에 관한 주제를 마무리 할 것입니다. 우리는 C ++에서 사용되는 암시 적 및 명시 적 변환에 대한 모든 것을 보았습니다.
그러나 데이터 손실 및 기타 어려움을 방지하기 위해 상황에 따라 필요한 경우에만 변환 또는 형변환이 현명하게 적용되어야 함을 알아야합니다.
=> 여기에서 초보자 C ++ 교육 가이드를 확인하십시오.
추천 도서