반응형
Notice
Recent Posts
Recent Comments
Link
Brise
[C++ 기본] 10. Casting 본문
반응형
C에서는 대부분의 캐스팅 연산을 사용자의 자유로 두고 있어 위험한 동작도 허용하는 경우가 많다.
// 10_캐스팅1.cpp 48 page
#include <iostream>
// C 캐스팅의 문제점
// 논리적으로 맞지 않고 위험한 경우도 대부분 성공한다.
// 그래서 C++은 4개의 캐스팅 연산을 제공한다.
int main()
{
int n = 3;
// double* p = &n; // C언어 : 경고, C++ : 에러
double* p = (double*)&n; // C스타일 캐스팅
*p = 3.4;
}
#include <iostream>
// static_cast : 논리적으로 맞고 위험하지 않은 경우만 허용
// void*=> 다른 타입*,
// 상속관계의 캐스팅 등.
// 반드시 연관성이 있어야 한다
int main()
{
double d = 3.4;
int n = d;
//int* p1 = malloc(100); // C언어 : ok. C++ : 에러
//int* p1 = (int*)malloc(100); // ok
// void* => 다른타입* 는 허용
int* p1 = static_cast<int*>( malloc(100) ); // C++ 캐스팅
//double* p2 = (double*)&n; // ok.
double* p2 = static_cast<double*>(&n); // error
const int c = 10;
//int* p3 = (int*)&c; // ok
int* p3 = static_cast<int*>(&c); // error.
}
//strict_cast
#include <iostream>
// reinterpret_cast : 포인터 <-> 포인터 변환(타입상관없음)
// 포인터 <-> 정수 변환
int main()
{
double d = 3.4;
//int n = d; // ok
int n = reinterpret_cast<int>(d); // error
//double* p2 = (double*)&n; // ok.
//double* p2 = static_cast<double*>(&n); // error
double* p2 = reinterpret_cast<double*>(&n); // ok
// 주소 => 정수로 캐스팅 또는 정수를 주소로 캐스팅
int x = reinterpret_cast<int>(&n); // ok
int* p2 = reinterpret_cast<int*>(100);// ok
}
reinterpret_cast는 타입 간의 오류를 체크하지는 않는다.
// const_cast :
int main()
{
const int c = 10;
int* p1 = &c; // error
int* p2 = (int*)&c; // ok
int* p3 = static_cast<int*>(&c); // error
int* p4 = reinterpret_cast<int*>(&c); // error.
// 상수성제거 안됨.
int* p5 = const_cast<int*>(&c); // ok..
// 동일 타입의 const 속성 제거
}
const_cast는 data 영역의 const 구문을 무시한다.
int main()
{
const int c = 10;
// c의 주소를 double* 에 담고 싶습니다.
// 방법 1. C 스타일 캐스팅
double* p = (double*)&c;
// 방법 2. C++ explicit 캐스팅(4개의 캐스팅) 활용
double* p1 = reinterpret_cast<double*>(
const_cast<int*>(&c)); // 해보세요..
}
예를 들어 const int 값의 포인터를 이용하여 double *형 데이터에 넣고 싶다면 C언어의 방법을 사용하는 방법도 있지만, C++타입의 cast 명령 2개를 조합하여 사용하는 방법이 있다.
물론 안전상으로는 static_cast 사용이 권장되지만, 경우에 따라 다른 casting을 사용하여야 할 수도 있으니,,
반응형
'프로그램 > C,C++' 카테고리의 다른 글
[C++ 기본 2] 2. memory allocation (0) | 2022.01.29 |
---|---|
[C++ 기본 2] 1. reference (0) | 2022.01.29 |
[C++ 기본] 11. nullptr (0) | 2022.01.29 |
[C++ 기본] 9. 제어문 (0) | 2022.01.29 |
[C++ 기본] 8. 반복문 (0) | 2022.01.29 |
[C++ 기본] 7. template function (0) | 2022.01.16 |
[C++ 기본] 6. Function (0) | 2022.01.15 |
Comments