C++转型操作符

简介:

转:http://www.cnblogs.com/hazir/archive/2012/04/14/2447251.html

旧式的C转型方式,几乎允许你将任何类型转换为任何其它类型,有其自身的缺陷,表现在以下两方面:

不能更精确地指明其转型的意图。

如将一个pointer-to-base-class-object 转型为一个pointer-to-derived-class-object(改变一个对象的类型)和将一个pointer-to-const-object转型为一个pointer-to-non-const-object(改变对象的常量性),在旧式C语法中并不区分。

难以辨识。

旧式C转型方式的语法为(type)expression,由一对小括号加上一个对象名称组成,而这种语法结构在C++的任何地方都有可能使用,这就无法很直观地判断出是否是转型操作。

 

为解决上述的缺点,C++引入4个新型转型操作符,分别为:

static_cast,  const_cast,   dynamic_cast,  reinterpret_cast

语法为:       ***_cast<type> (expression).

下面着重解释四个新型操作符的用途:

static_cast: 基本与拥有与C旧式转型相同的威力与意义,以及相同的限制。如:

//计算两个int型数相除,结果为double型
int firstNum, secondNum;
double res = (double)firstNum / secondNum;                //旧式C语法
double res = static_cast<double>(firstNum) / secondNum;   //新式C++转型符

const_cast: 用来改变表达式中的常量性(constness)或易变性(volatileness)。如:

int num;
const int *cpNum = &num;
int *pNum = cpNum;            //error:cannot convert from 'const int *' to 'int *'
int *pNum = (int *)cpNum;                 //旧式C
int *pNum = const_cast<int *>(cpNum);     //新式C++ const_cast移除常量性

dynamic_cast: 用来执行继承体系中“安全的向下转型或跨系转型动作”。如:

//可以利用dynamic_cast将“指向base class object 的pointer或reference”转型为“指向derived class object的pointer或reference”
//如果转型失败,会以一个null指针或一个exception 表现出来
class CBase {     };                        //基类
class CDerived: public CBase  {     };      //继承类
 
 
CDerived dc;
CDerived *dp = &dc;
CBase *bp = dynamic_cast<CBase *>(dp);      //使用dynamic_cast将指向继承类的指针转化为指向基类的指针 
CBase &br = dynamic_cast<CBase &>(dc);      //使用dynamic_cast将指向继承类的引用转化为指向基类的引用

reinterpret_cast: 最常用的用途是转换"函数指针"类型。如:

typedef void (*funcPtr)();    //funcPtr是个无参数返回值为void型的函数指针类型
int iFunc(){return 0;}        //iFunc为一个无参数返回值为int型的函数
void func(funcPtr f){}        //func函数的参数是一个类型为funcPtr类型的函数指针
main()
{
    func(iFunc());        //error:cannot convert parameter 1 from 'int' to 'void (__cdecl *)(void)'
    func(reinterpre_cast<funcPtr>(iFunc);     //right! reinterpre_cast将返回值为int 的函数转化为 返回值为void 的函数
}

 


本文转自einyboy博客园博客,原文链接:http://www.cnblogs.com/einyboy/p/3181299.html,如需转载请自行联系原作者。



目录
相关文章
|
6月前
|
存储 C++
C/C++中位操作符(&,|,^,~)的详解使用
C/C++中位操作符(&,|,^,~)的详解使用
|
安全 C++
【C++11保姆级教程】移动构造函数(move constructor)和移动赋值操作符(move assignment operator)
【C++11保姆级教程】移动构造函数(move constructor)和移动赋值操作符(move assignment operator)
713 0
|
3月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
40 0
|
6月前
|
算法 安全 程序员
【C++14 新特性 透明操作符】透视C++14透明操作符Functors:深入理解与实践
【C++14 新特性 透明操作符】透视C++14透明操作符Functors:深入理解与实践
159 3
|
6月前
|
算法 程序员 C语言
【C++ 运算符重载】深入理解C++迭代器中的前置与后置++操作符
【C++ 运算符重载】深入理解C++迭代器中的前置与后置++操作符
238 0
|
6月前
|
设计模式 存储 算法
【C++ 函数调用操作符】探究C++中的函数调用操作符 基础到高级应用
【C++ 函数调用操作符】探究C++中的函数调用操作符 基础到高级应用
333 0
|
6月前
|
存储 程序员 C++
C/C++ 内存分配 new 操作符:剖析new操作符的实现机制和使用技巧
C/C++ 内存分配 new 操作符:剖析new操作符的实现机制和使用技巧
138 0
|
6月前
|
C++
C++ operator关键字的使用(重载运算符、仿函数、类型转换操作符)
C++ operator关键字的使用(重载运算符、仿函数、类型转换操作符)
86 0
|
6月前
|
算法 编译器 C++
【C++11保姆级教程】深入浅出异常说明符、异常操作符和lambda表达式
【C++11保姆级教程】深入浅出异常说明符、异常操作符和lambda表达式
119 0
C++-string““s操作符C++-string““s操作符
C++-string““s操作符C++-string““s操作符