在 C++ 语言中新增了四个关键字 static_cast,const_cast,reinterpret_cast 和 dynamic_cast. 这四个关键字都是用于强制类型转换的. 我们逐一来介绍这四个关键字.
1) static_cast:
在 C++ 语言中 static_cast 用于内置基本数据类型型的强制转换, 强制将一种数据类型转换为另一种数据类型. 例如将整型数据转换为浮点型数据.
[例 1]C 语言所采用的类型转换方式:
- int a = 10;
- int b = 3;
- double result = (double)a / (double)b;
例 1 中将整型变量 a 和 b 转换为双精度浮点型, 然后相除. 在 C++ 语言中, 我们可以采用 static_cast 关键字来进行强制类型转换, 如下所示.
[例 2]static_cast 关键字的使用:
- int a = 10;
- int b = 3;
- double result = static_cast<double>(a) / static_cast<double>(b);
在本例中同样是将整型变量 a 转换为双精度浮点型. 采用 static_cast 进行强制数据类型转换时, 将想要转换成的数据类型放到尖括号中, 将待转换的变量或表达式放在元括号中, 其格式可以概括为如下形式:
static_cast <类型说明符> (变量或表达式)
2) const_cast
在 C 语言中, const 限定符通常被用来限定变量, 用于表示该变量的值不能被修改. 而 const_cast 则正是用于强制去掉这种不能被修改的常数特性, 但需要特别注意的是 const_cast 不是用于去除变量的常量性, 而是去除指向常数对象的指针或引用的常量性, 其去除常量性的对象必须为指针或引用.
[例 3]一个错误的例子:
- const int a = 10;
- const int * p = &a;
- *p = 20; //compile error
- int b = const_cast<int>(a); //compile error
在本例中出现了两个编译错误, 第一个编译错误是 * p 因为具有常量性, 其值是不能被修改的;
另一处错误是 const_cast 强制转换对象必须为指针或引用, 而例 3 中为一个变量, 这是不允许的!
dynamic_cast:
(1)其他三种都是编译时完成的, dynamic_cast 是运行时处理的, 运行时要进行类型检查.
(2)不能用于内置的基本数据类型的强制转换.
(3)dynamic_cast 转换如果成功的话返回的是指向类的指针或引用, 转换失败的话则会返回 NULL.
(4)使用 dynamic_cast 进行转换的, 基类中一定要有虚函数, 否则编译不通过.
B 中需要检测有虚函数的原因: 类中存在虚函数, 就说明它有想要让基类指针或引用指向派生类对象的情况, 此时转换才有意义.
这是由于运行时类型检查需要运行时类型信息, 而这个信息存储在类的虚函数表 (关于虚函数表的概念, 详细可见 < Inside c++ object model>) 中, 只有定义了虚函数的类才有虚函数表.
(5)在类的转换时, 在类层次间进行上行转换时, dynamic_cast 和 static_cast 的效果是一样的. 在进行下行转换时, dynamic_cast 具有类型检查的功能, 比 static_cast 更安全. 向上转换即为指向子类对象的向下转换, 即将父类指针转化子类指针. 向下转换的成功与否还与将要转换的类型有关, 即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同, 否则转换失败.
来源: http://www.bubuko.com/infodetail-2579598.html