Updated:

1 minute read

개요

  • static_cast
    • 명시적(explicit) 변환
  • const_cast
    • 상수성 추가/제거
  • as_const
    • C++17
    • const reference로 변환
  • dynamic_cast
    • 런타임에 다형성을 만족하는 파생 클래스 사이에서의 up/down cast
  • reinterpret_cast
    • 강제 형변환


예제

  • 코드
     #include <cstdlib>
     #include <iostream>
     #include <string>
     #include <typeinfo>
     #include <utility>
        
     using namespace std;
        
     void func(string *s) {
     	*s += "1";
     	cout << "call func(string* s)" << endl;
     }
     void func(const string *s) { cout << "call func(const string* s)" << endl; }
        
     void func(string &s) {
     	s += "1";
     	cout << "call func(string& s)" << endl;
     }
     void func(const string &s) { cout << "call func(const string& s)" << endl; }
        
     class Base {
     	public:
     		virtual ~Base() {}
     };
     class Derived : public Base {
     	public:
     		virtual ~Derived() {}
        
     		void show() { cout << 1 << endl; }
     };
        
     class Test1 {};
     class Test2 {
     	public:
     		void show() { cout << 1 << endl; }
     };
        
     int main() {
     	int i = 1;
     	cout << typeid(static_cast<double>(i)).name() << endl;
        
     	const string s = "abc";
     	func(const_cast<string *>(&s));
     	cout << s << endl;
        
     	string ss = "abc";
     	func(const_cast<const string *>(&ss));
     	cout << ss << endl;
        
     	string sss = "abc";
     	func(as_const(sss));
     	cout << sss << endl;
     	func(sss);
     	cout << sss << endl;
        
     	Base *base = NULL;
     	Derived *derived = new Derived;
     	base = dynamic_cast<Base *>(derived);
     	derived = dynamic_cast<Derived *>(base);
     	derived->show();
     	delete derived;
     	base = NULL;
     	derived = NULL;
        
     	Test1 *t1 = NULL;
     	Test2 *t2 = new Test2;
     	t1 = reinterpret_cast<Test1 *>(t2);
     	t2 = reinterpret_cast<Test2 *>(t1);
     	t2->show();
     	delete t2;
     	t1 = NULL;
     	t2 = NULL;
        
     	return 0;
     }
    
  • 실행 결과
     d
     call func(string* s)
     abc1
     call func(const string* s)
     abc
     call func(const string& s)
     abc
     call func(string& s)
     abc1
     1
     1