C++数据类型显示转换
2012-11-15 11:28
417 查看
显示转换也叫做强制类型转换,包括下面四个:
1)static_cast
2)dynamic_cast
3)const_cast
4)reinterpret_cast
1)static_cast
编译器隐式执行的任何类型转换都可以有static_cast显示完成。
2)dynamic_cast
dynamic_cast支持运行时识别指针或引用所指向的对象,可以使用dynamic_cast操作符将基类类型对象的引用或者指针转换为同一继承层次中其他类型的引用或者指针。要注意的是,dynamic_cast需要在程序运行时执行检查,需要执行两个操作。首先需要检查被请求的转换是否有效,如果绑定到指针或者引用的对象不是目标类型的对象,则转换失败,结果为0,返回0,同时抛出异常(bad_cast)。如检查验证成功,那么就会执行实际转换,转换成功,返回目标转换类型,否则返回0,抛出异常bad_cast。
dynamic_cast“允许”将基类的引用或者指针赋值给派生类的引用或者指针,但是必须是“返璞归真”。像上面的代码,如果直接执行语句
Derived1 *p = basePtr;
显然是编译不通过的,但是通过dynamic_cast的转换,就允许了,但是这个允许的条件是basePtr必须是指向Derived1的对象的指针。
3)const_cast
顾名思义,const_cast会把表达式的const性质移除。只有合法使用const_cast才能将表达式的const性质转换掉,任何通过其他三种形式的强制转换都会导致编译时出错,类似的,除了添加和删除const特性,试图使用const_cast来执行其他类型转换的时候也都会告之以失败。
4)reinterpret_cast(本质上依赖于机器)
reinterpret_cast提供了对较低层次的操作数的位模式的重新解释。
总结:static_cast可以完成编译器的任何隐式转换,const_cast将目标的const特性转换掉,dynamic_cast则是返璞归真。
警告:强制类型转换,少用慎用,一生受用
以上内容来自读<<C++primer>>所得。
1)static_cast
2)dynamic_cast
3)const_cast
4)reinterpret_cast
1)static_cast
编译器隐式执行的任何类型转换都可以有static_cast显示完成。
2)dynamic_cast
dynamic_cast支持运行时识别指针或引用所指向的对象,可以使用dynamic_cast操作符将基类类型对象的引用或者指针转换为同一继承层次中其他类型的引用或者指针。要注意的是,dynamic_cast需要在程序运行时执行检查,需要执行两个操作。首先需要检查被请求的转换是否有效,如果绑定到指针或者引用的对象不是目标类型的对象,则转换失败,结果为0,返回0,同时抛出异常(bad_cast)。如检查验证成功,那么就会执行实际转换,转换成功,返回目标转换类型,否则返回0,抛出异常bad_cast。
#include <iostream> using namespace std; class Base { public: Base() { cout << "Base对象创建!\n"; } virtual ~Base() { cout << "Base对象删除!\n"; } void Print() { cout << "我是Base的Print\n"; } }; class Derived1:public Base { public: Derived1() { cout << "Derived1对象创建!\n"; } virtual ~Derived1() { cout << "Derived1对象删除!\n"; } virtual void Print() { cout << "我是Derived1的Print\n"; } }; class Derived2:public Base { public: Derived2() { cout << "Derived2对象创建!\n"; } virtual ~Derived2() { cout << "Derived2对象删除!\n"; } virtual void Print() { cout << "我是Derived2的Print\n"; } }; int main(int argc, char *argv[]) { Base *basePtr = new Derived1(); //Base *basePtr = new Derived2(); //Base *basePtr = new Base(); //对象是Base和Derived1都会导致dynamic_cast转换失败 //只有basePtr指向的是Derived1对象时才会成功 if( Derived1 *p = dynamic_cast<Derived1 *>(basePtr) ) { p->Print(); } else { cout << "转换失败!\n"; } return 0; }
dynamic_cast“允许”将基类的引用或者指针赋值给派生类的引用或者指针,但是必须是“返璞归真”。像上面的代码,如果直接执行语句
Derived1 *p = basePtr;
显然是编译不通过的,但是通过dynamic_cast的转换,就允许了,但是这个允许的条件是basePtr必须是指向Derived1的对象的指针。
3)const_cast
顾名思义,const_cast会把表达式的const性质移除。只有合法使用const_cast才能将表达式的const性质转换掉,任何通过其他三种形式的强制转换都会导致编译时出错,类似的,除了添加和删除const特性,试图使用const_cast来执行其他类型转换的时候也都会告之以失败。
4)reinterpret_cast(本质上依赖于机器)
reinterpret_cast提供了对较低层次的操作数的位模式的重新解释。
总结:static_cast可以完成编译器的任何隐式转换,const_cast将目标的const特性转换掉,dynamic_cast则是返璞归真。
警告:强制类型转换,少用慎用,一生受用
以上内容来自读<<C++primer>>所得。
相关文章推荐
- C++数据类型显示转换
- C++数据类型显示转换
- C++内置数字数据类型与string间的转换--以double为例
- C#与C++数据类型比较及结构体转换(搜集整理二)
- 【转】C#调用C++的DLL搜集整理的所有数据类型转换方式
- C++数据类型转换之一字符串类型间的转换
- C++【显示类型转换】
- C/C++数据类型转换-------PowerBuilder 数据类型
- C++的一些基本数据类型转换
- 走进C++程序世界-------强制数据类型转换(static_cast、dynamic_cast、reinterpret_cast、const_cast)
- C#与C++的混合编程 之三 C++与C#的数据传递与类型转换
- C/C++ 基本数据类型之间的相互转换 int / char / string / vector windows与linux通用
- C++数据类型转换
- jsp jstl 时间类型转换,多表数据显示,判断为空
- C++中的数据类型转换方法总结
- C#调用C++的DLL搜集整理的所有数据类型转换方式
- symbian c++ 各种数据类型转换
- C++数据类型转换
- C#与C++数据类型比较及结构体转换(搜集整理二)
- C++中的数据类型转换方法总结