C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结
2017-05-16 15:41
435 查看
因为原来C风格的暴力万能类型转换容易导致运行时出错,所以要引入分类更清晰提前发现错误的转换语法。
对象的类型转换包含了对象的引用或指针。
1.static_cast是编译器默认选项,该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
但是没有动态检查所以类对象间非直线继承转换不支持(无关对象指针类型),C风格的转换确是可以的,所以并不是C风格转换的替代品。
所以基本类型转换,类上行转换(类的下行转换有隐患),把其它类型转换为void*都是安全的(void*转换为目标类型就要小心了)。
2.dynamic_cast是动态类型转换提前检查:
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*。
1)下行转换,兄弟之间转换,动态实例到当前指针非直线继承转换
如果不安全(父实例不能下行,兄弟实例不能相互转换),那么会提前得到空指针。
如果安全,那么下行转换和对象间非直线继承转换(包括上行)还需要有虚函数,才支持动态转换(实例合理则不为空),一般继承中都用虚析构函数故基本是没问题的。
2).上行转换和多继承情况:
多继承中,多条路径时候需要多次dynamic_cast指定以表明用具体路径进行转换。
3.const_cast一般将常量转换为非常量指针,用非常量指针对数据进行修改。该运算符用来修改类型的const或volatile属性。除了const
或volatile修饰之外, type_id和expression的类型是一样的。
4.reinterpret_cast是将一种类型无位损失的转换为另一种类型例如字符串转换为整型,他们的内存结构会是一样的,也可以把一种类型转换为*void再由于*void转换回该类型。
type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作。
测试实例:
class A
{
public:
int a;
A()
{
a = 0;
}
virtual void display()
{
cout<< "I am A"<<endl;
}
virtual ~A()
{
}
};
class AImpl: public A
{
public:
int b;
AImpl()
{
b = 0;
}
virtual void display()
{
cout<< "I am AImpl"<<endl;
}
virtual ~AImpl()
{
}
};
class B: public AImpl
{
public:
int b;
B()
{
b = 0;
}
virtual void display()
{
cout<< "I am B"<<endl;
}
virtual ~B()
{
}
};
class C:public AImpl
{
public:
int a;
C()
{
a = 0;
}
virtual void display()
{
cout<< "I am C"<<endl;
}
virtual ~C()
{
}
};
class D: public B,public C
{
virtual void display()
{
cout<< "I am D"<<endl;
}
};
int main( int argc, char *argv[] )
{
D *d = new D();
B *b =dynamic_cast<B*>(d);
A *a = dynamic_cast<A*>(b);
AImpl *aimp= dynamic_cast<AImpl*>(a);
aimp->display();
}
reference:
http://www.cplusplus.com/doc/tutorial/typecasting/
https://msdn.microsoft.com/en-us/library/cby9kycs
对象的类型转换包含了对象的引用或指针。
1.static_cast是编译器默认选项,该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
但是没有动态检查所以类对象间非直线继承转换不支持(无关对象指针类型),C风格的转换确是可以的,所以并不是C风格转换的替代品。
所以基本类型转换,类上行转换(类的下行转换有隐患),把其它类型转换为void*都是安全的(void*转换为目标类型就要小心了)。
2.dynamic_cast是动态类型转换提前检查:
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*。
1)下行转换,兄弟之间转换,动态实例到当前指针非直线继承转换
如果不安全(父实例不能下行,兄弟实例不能相互转换),那么会提前得到空指针。
如果安全,那么下行转换和对象间非直线继承转换(包括上行)还需要有虚函数,才支持动态转换(实例合理则不为空),一般继承中都用虚析构函数故基本是没问题的。
2).上行转换和多继承情况:
多继承中,多条路径时候需要多次dynamic_cast指定以表明用具体路径进行转换。
3.const_cast一般将常量转换为非常量指针,用非常量指针对数据进行修改。该运算符用来修改类型的const或volatile属性。除了const
或volatile修饰之外, type_id和expression的类型是一样的。
4.reinterpret_cast是将一种类型无位损失的转换为另一种类型例如字符串转换为整型,他们的内存结构会是一样的,也可以把一种类型转换为*void再由于*void转换回该类型。
type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作。
测试实例:
class A
{
public:
int a;
A()
{
a = 0;
}
virtual void display()
{
cout<< "I am A"<<endl;
}
virtual ~A()
{
}
};
class AImpl: public A
{
public:
int b;
AImpl()
{
b = 0;
}
virtual void display()
{
cout<< "I am AImpl"<<endl;
}
virtual ~AImpl()
{
}
};
class B: public AImpl
{
public:
int b;
B()
{
b = 0;
}
virtual void display()
{
cout<< "I am B"<<endl;
}
virtual ~B()
{
}
};
class C:public AImpl
{
public:
int a;
C()
{
a = 0;
}
virtual void display()
{
cout<< "I am C"<<endl;
}
virtual ~C()
{
}
};
class D: public B,public C
{
virtual void display()
{
cout<< "I am D"<<endl;
}
};
int main( int argc, char *argv[] )
{
D *d = new D();
B *b =dynamic_cast<B*>(d);
A *a = dynamic_cast<A*>(b);
AImpl *aimp= dynamic_cast<AImpl*>(a);
aimp->display();
}
reference:
http://www.cplusplus.com/doc/tutorial/typecasting/
https://msdn.microsoft.com/en-us/library/cby9kycs
相关文章推荐
- C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结
- static_cast dynamic_cast const_cast reinterpret_cast总结对比
- static_cast dynamic_cast reinterpret_cast const_cast 的区别和使用方法
- reinterpret_cast const_cast dynamic_cast static_cast 区别使用【zhuan】
- 转【C++专题】static_cast, dynamic_cast, const_cast探讨 ---static_cast dynamic_cast const_cast reinpreter 设计原因
- 使用过的函数--static_cast/memcpy/zeromemery 以后总结
- static-cast dynamic_cast const_cast reinterpret_cast
- static_cast,dynamic_cast,const_cast,reinterpret_cast使用总结
- static_cast dynamic_cast const_cast reinterpret_cast 类型转换
- C++类型转换: static_cast const_cast reinterpret_cast dynamic_cast
- static_cast dynamic_cast reinterpret_cast 使用准则 guide from stackoverflow
- static_cast dynamic_cast reindivter_cast const_cast 详解
- C++命名的强制类型转换(static_cast dynamic_cast const_cast reinterpret_cast)
- C++ 类型转换 (static_cast dynamic_cast reinterpret_cast const_cast typeid)
- 关于static_cast dynamic_cast reinterpret_cast的使用方法和场合
- C++ static_cast dynamic_cast reinterpret_cast const_cast转换
- 4种类型转换操作符 (static_cast const_cast dynamic_cast reinterpret_cast)
- static_cast dynamic_cast reinterpret_cast const_cast
- c++ static使用场景总结
- 关于static_cast dynamic_cast reinterpret_cast的使用方法和场合