정체불명의 모모
[c++]static_cast 란? 본문
static_cast란?
: 기본 자료형의 형변환 및 기본(base) 클래스에서 파생(derived) 클래스로의 포인터 변환 연산에 사용할 수 있다.
형 변환 시점이 컴파일 시점이기 때문에 static 이라는 명칭이 붙는다.
( 정적 캐스팅 / 논리적인 캐스팅 / 묵시적 형변환과 같다.)
static_cast<바꾸려는 타입>(대상)
static_cast를 사용하는 이유
- 실수형과 정수형, 정수형과 열거형등의 기본 데이터 타입 간의 변환
- 상속관계의 클래스 계층 간의 변환
- void 포인터를 다른 타입의 포인터로 변환
- 서로 다른 타입의 포인터 간의 타입 변환은 못함
static_cast의 제약 사항
- 런타임 타입 검사를 하지 않음
- 아형성이 없어도 변환가능(RTTI 옵션이 꺼져있어도 된다.)
- 다중 상속에서 기본 클래 간의 타입 변환은 못함
일반 변수의 형변환들 예제
#include <iostream>
using namespace std;
int main()
{
double dou = 10.1234;
int integer_1 = dou; // 묵시적 형변환
int integer_2 = (int)dou; // 명시적 형변환
int integer_3 = static_cast<int>(dou); // static_cast 형변환
char a = 'a';
int charInt = static_cast<char>(a);
cout << integer_1 << endl; // 10
cout << integer_2 << endl; // 10
cout << integer_3 << endl; // 10
cout << charInt << endl; // 97
return 0;
}
포인터에서의 형변환들
#include <iostream>
using namespace std;
int main()
{
double* dou = new double(10.1234);
// int * integer_1 = dou; // 묵시적 형변환
int * integer_2 = (int*)dou; // 명시적 형변환
// int * integer_3 = static_cast<int*>(dou); // static_cast 형변환
cout << *integer_2 << endl; // 1223206686 <- 이상한 값 출력
return 0;
}
※ 명시적 형변환이 허용이 되었다고 해도 실제로 값은 이상하게 출력된다.
상속관계에서의 형변환
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void sound() = 0;
void info()
{
cout << "동물은 숨을 쉽니다." << endl;
}
};
class Dog : public Animal
{
private:
string name;
public:
Dog(string s) : name(s) {};
void sound() {cout << "멍멍!" << endl;}
void name_print() {cout << name << endl;}
void only_dog() {cout << "이건 개 클래스" << endl;}
};
class Cat : public Animal
{
private:
string name;
public:
Cat(string s) : name(s) {};
void sound() {cout << "야옹!" << endl;}
void name_print() {cout << name << endl;}
void only_cat() {cout << "이건 고양이 클래스" << endl;}
};
int main()
{
Cat* cat_1 = new Cat("나비");
Dog* dog_1 = new Dog("멍멍이");
// cat_1 = dog_1; // 묵시적 형변환
cat_1= (Cat*)dog_1; // 명시적 형변환
// cat_1 = static_cast<Cat*>(dog_1); //static_cast 형변환
cat_1->sound(); // 멍멍!
cat_1->only_cat(); // 이건 고양이 클래스
return 0;
}
※ 이상한 결과 값이 나오는것을 확인 할 수 있다.
참고 사이트
https://hwan-shell.tistory.com/211?category=703822
C++] static_cast란??
모든 언어에는 형변환이 있습니다. C++에선 다양한 형번환 객체들을 제공합니다. 1. static_cast 2. dynamic_cast = https://hwan-shell.tistory.com/213 3. const_cast = https://hwan-shell.tistory.com/215 4..
hwan-shell.tistory.com
https://gamelaboratory.tistory.com/entry/C-%ED%98%95%EB%B3%80%ED%99%98-staticcast
C++ - 형변환 static_cast
2. static_cast 기본 자료형의 형변환 및 기본(base) 클래스에서 파생(derived) 클래스로의 포인터 변환 연산에 사용할수 있다. 묵시적 형변환과 같다. 1) 특징 (1) 명시적으로 정수 값을 열거 형식으로 변
gamelaboratory.tistory.com
C++ 이야기 - [3] 캐스트 연산자 static_cast
C++의 4가지 캐스트 연산자에 대한 이야기 중 세 번째다. 이번은 그중에서 static_cast 에 대해서 이야기한다. static_cast 는 기본적으로 C 스타일의 캐스팅과 가장 비슷한 기능을 한다. 물론 C 스타일의
prostars.net
'프로그래밍(c++)' 카테고리의 다른 글
[c++ / 리눅스] Condition Variable (0) | 2021.09.15 |
---|---|
[c언어] Mutex , cond 기본정리 (0) | 2021.09.14 |
[이론] 업캐스팅과 다운캐스팅이란??(필요성, 예제) (0) | 2021.09.08 |
[c++] dynamic_cast 란? (2) | 2021.09.08 |
[C++] 상속 관계에서 생성자, 소멸자 호출 순서 / virtual 소멸자 (0) | 2021.08.11 |