static_cast?
- C++에서 제공하는 기능중 하나로 프로그래머가 형변환을 할 때 오류를 체크
- 기본 형태
static_cast<바꾸려고 하는 타입>(대상);
static_cast<new_type>(expression)
- 논리적으로 변환 가능한 타입을 변환
- compile 타임에 형변환에 대한 타입 오류를 잡아준다.
- 실수와 정수, 열거형과 정수형, 실수와 실수 사이의 변환 등을 허용
- Array -> point로 변환이 가능
- function -> function pointer로 변환이 가능
- 포인터 타입을 다른 것으로 변환하는 것을 허용하지 않는다.
- 단, 상속 관계에 있는 포인터 끼리는 변환이 가능
- 바꾸려는 타입에는 void 형이 올 수 있지만 계산 후 제거된다.
일반 변수 간의 형변환
#include<iostream>
using namespace std;
int main(){
double d = 13.24;
float f = 10.12f;
double d_temp;
int i_temp;
float f_temp;
i_temp = static_cast<int>(d);
cout<<"static_cast<int>(double) = "<<i_temp<<'\n';
f_temp = static_cast<float>(d);
cout<<"static_cast<float>(double) = "<<f_temp<<'\n';
d_temp = static_cast<double>(f);
cout<<"static_cast<double>(float) = "<<d_temp<<'\n';
}
// 결과
static_cast<int>(double) = 13
static_cast<float>(double) = 13.24
static_cast<double>(float) = 10.12
포인터 타입, 배열의 형변환
#include<iostream>
using namespace std;
int main(){
int arr[10] = {11, 13, 15, 17, 19, 21, 23, 25, 27, 29};
int *ptr;
ptr = static_cast<int*>(arr);
cout<<"1. int array -> int* : ";
for(int i = 0;i<10;i++)
cout<<ptr[i]<<' ';
cout<<'\n';
char str[] = "HanseongBugi";
int *ptr2;
// ptr2 = static_cast<int*>(str); // Compile Error
// cout<<*ptr2<<'\n';
int temp = 10;
int *ptr3 = &temp;
// char *c = static_cast<char*>(ptr3); // Compile Error
// cout<<*ptr3<<'\n';
}
// 결과
1. int array -> int* : 11 13 15 17 19 21 23 25 27 29
열겨형(Enum) 형변환
#include<iostream>
using namespace std;
enum E_VAL {A=11, B, C};
int main(){
E_VAL e = A;
cout<<"E_VAL : "<<e<<'\n';
int a;
a = static_cast<int>(e);
cout<<"1. static_cast<int>(enum) = "<<a<<'\n';
int b;
b = static_cast<int>(B);
cout<<"2. static_cast<int>(enum) = "<<b<<'\n';
E_VAL e2;
e2 = static_cast<E_VAL>(13);
cout<<"3. static_cast<enum>(int) = "<<e2<<'\n';
}
// 결과
E_VAL : 11
1. static_cast<int>(enum) = 11
2. static_cast<int>(enum) = 12
3. static_cast<enum>(int) = 13
상속관계에서의 형변환
#include<iostream>
using namespace std;
class Shape{
private:
int a;
public:
virtual void draw(){
cout<<"Shape : called draw()"<<'\n';
}
};
class Triangle : public Shape{
private:
int b;
public:
Triangle() : b(30){};
void draw(){
cout<<"Triangle : called draw()"<<'\n';
}
void onlyTriangle(){
cout<<"Triangle : onlyTriangle()"<<'\n';
cout<<b<<'\n';
}
};
int main(){
Shape *ps;
Triangle t;
ps = static_cast<Shape*>(&t);
cout<<"1. upcasting"<<'\n';
ps->draw();
Shape s;
Triangle *pt;
cout<<"2. Downcasting"<<'\n';
pt = static_cast<Triangle*>(&s);
pt->draw();
pt->onlyTriangle();
}
// 결과
1. upcasting
Triangle : called draw()
2. Downcasting
Shape : called draw()
Triangle : onlyTriangle()
1
- Downcasting 시 부모 클래스의 인스턴스로 자식의 멤버 함수를 호출하는 것은 비 정상적인 결과를 초래할 수 있다.
- 즉, 자식 클래스의 멤버 함수를 호출하면 예상 값과 다르게 나올 수 있다.
- 결과를 보면 Triangle의 멤버 변수인 b의 값이 임의의 값으로 결정되어 출력되는 것을 볼 수 있다.
static_cast와 C스타일 캐스팅의 차이
- 가장 큰 차이점은 static_cast의 경우 컴파일러가 캐스팅을 확인하며 C스타일 캐스팅의 경우 런타임 과정에서 에러가 발생하였는지 확인할 수 있다.
#include<iostream>
using namespace std;
int main(void)
{
char a = 10;
// int *p = static_cast<int*>(&a); // compile error
int *p2 = (int*)&a;
*p = 5; // runtime error
}
- 보다 엄격(restrictive)함
- 아래와 같이 포인터 형변환이 불가능하다.
- 자료형 자체가 다르다보니 된다 한들 의미도 없다.
#include<iostream>
using namespace std;
int main(void)
{
int n = 5, *p;
double f = 3.14, *q;
p = &n;
// q = static_cast<double*>(&n); // compile error
}
출처
https://blockdmask.tistory.com/236
https://hwan-shell.tistory.com/211
https://zbomoon.tistory.com/22
'C++' 카테고리의 다른 글
<C++> enum class (0) | 2024.04.04 |
---|---|
<C++> nullptr (0) | 2024.04.03 |
<STL> Array (0) | 2024.02.01 |
<STL> List (0) | 2024.02.01 |
<STL> Vector (0) | 2024.02.01 |
static_cast?
- C++에서 제공하는 기능중 하나로 프로그래머가 형변환을 할 때 오류를 체크
- 기본 형태
static_cast<바꾸려고 하는 타입>(대상);
static_cast<new_type>(expression)
- 논리적으로 변환 가능한 타입을 변환
- compile 타임에 형변환에 대한 타입 오류를 잡아준다.
- 실수와 정수, 열거형과 정수형, 실수와 실수 사이의 변환 등을 허용
- Array -> point로 변환이 가능
- function -> function pointer로 변환이 가능
- 포인터 타입을 다른 것으로 변환하는 것을 허용하지 않는다.
- 단, 상속 관계에 있는 포인터 끼리는 변환이 가능
- 바꾸려는 타입에는 void 형이 올 수 있지만 계산 후 제거된다.
일반 변수 간의 형변환
#include<iostream>
using namespace std;
int main(){
double d = 13.24;
float f = 10.12f;
double d_temp;
int i_temp;
float f_temp;
i_temp = static_cast<int>(d);
cout<<"static_cast<int>(double) = "<<i_temp<<'\n';
f_temp = static_cast<float>(d);
cout<<"static_cast<float>(double) = "<<f_temp<<'\n';
d_temp = static_cast<double>(f);
cout<<"static_cast<double>(float) = "<<d_temp<<'\n';
}
// 결과
static_cast<int>(double) = 13
static_cast<float>(double) = 13.24
static_cast<double>(float) = 10.12
포인터 타입, 배열의 형변환
#include<iostream>
using namespace std;
int main(){
int arr[10] = {11, 13, 15, 17, 19, 21, 23, 25, 27, 29};
int *ptr;
ptr = static_cast<int*>(arr);
cout<<"1. int array -> int* : ";
for(int i = 0;i<10;i++)
cout<<ptr[i]<<' ';
cout<<'\n';
char str[] = "HanseongBugi";
int *ptr2;
// ptr2 = static_cast<int*>(str); // Compile Error
// cout<<*ptr2<<'\n';
int temp = 10;
int *ptr3 = &temp;
// char *c = static_cast<char*>(ptr3); // Compile Error
// cout<<*ptr3<<'\n';
}
// 결과
1. int array -> int* : 11 13 15 17 19 21 23 25 27 29
열겨형(Enum) 형변환
#include<iostream>
using namespace std;
enum E_VAL {A=11, B, C};
int main(){
E_VAL e = A;
cout<<"E_VAL : "<<e<<'\n';
int a;
a = static_cast<int>(e);
cout<<"1. static_cast<int>(enum) = "<<a<<'\n';
int b;
b = static_cast<int>(B);
cout<<"2. static_cast<int>(enum) = "<<b<<'\n';
E_VAL e2;
e2 = static_cast<E_VAL>(13);
cout<<"3. static_cast<enum>(int) = "<<e2<<'\n';
}
// 결과
E_VAL : 11
1. static_cast<int>(enum) = 11
2. static_cast<int>(enum) = 12
3. static_cast<enum>(int) = 13
상속관계에서의 형변환
#include<iostream>
using namespace std;
class Shape{
private:
int a;
public:
virtual void draw(){
cout<<"Shape : called draw()"<<'\n';
}
};
class Triangle : public Shape{
private:
int b;
public:
Triangle() : b(30){};
void draw(){
cout<<"Triangle : called draw()"<<'\n';
}
void onlyTriangle(){
cout<<"Triangle : onlyTriangle()"<<'\n';
cout<<b<<'\n';
}
};
int main(){
Shape *ps;
Triangle t;
ps = static_cast<Shape*>(&t);
cout<<"1. upcasting"<<'\n';
ps->draw();
Shape s;
Triangle *pt;
cout<<"2. Downcasting"<<'\n';
pt = static_cast<Triangle*>(&s);
pt->draw();
pt->onlyTriangle();
}
// 결과
1. upcasting
Triangle : called draw()
2. Downcasting
Shape : called draw()
Triangle : onlyTriangle()
1
- Downcasting 시 부모 클래스의 인스턴스로 자식의 멤버 함수를 호출하는 것은 비 정상적인 결과를 초래할 수 있다.
- 즉, 자식 클래스의 멤버 함수를 호출하면 예상 값과 다르게 나올 수 있다.
- 결과를 보면 Triangle의 멤버 변수인 b의 값이 임의의 값으로 결정되어 출력되는 것을 볼 수 있다.
static_cast와 C스타일 캐스팅의 차이
- 가장 큰 차이점은 static_cast의 경우 컴파일러가 캐스팅을 확인하며 C스타일 캐스팅의 경우 런타임 과정에서 에러가 발생하였는지 확인할 수 있다.
#include<iostream>
using namespace std;
int main(void)
{
char a = 10;
// int *p = static_cast<int*>(&a); // compile error
int *p2 = (int*)&a;
*p = 5; // runtime error
}
- 보다 엄격(restrictive)함
- 아래와 같이 포인터 형변환이 불가능하다.
- 자료형 자체가 다르다보니 된다 한들 의미도 없다.
#include<iostream>
using namespace std;
int main(void)
{
int n = 5, *p;
double f = 3.14, *q;
p = &n;
// q = static_cast<double*>(&n); // compile error
}
출처
https://blockdmask.tistory.com/236
https://hwan-shell.tistory.com/211
https://zbomoon.tistory.com/22
'C++' 카테고리의 다른 글
<C++> enum class (0) | 2024.04.04 |
---|---|
<C++> nullptr (0) | 2024.04.03 |
<STL> Array (0) | 2024.02.01 |
<STL> List (0) | 2024.02.01 |
<STL> Vector (0) | 2024.02.01 |