呵呵,今天来好好看看着几个转换操作符的用法。以前老是看着眼熟,但是用着手生。今天决定搞定这些个东西。
在C语言中类型转换有几种方式:
1. (expression). 在表达式外边加括号,由编译器来决定怎么改变。
2. new_type(expression). 强制类型括号住表达式。
3. (new_type)expression. 括号住强制类型。
4. C语言允许的内置转换。
这些转换非常高效,我非常喜欢使用。特别是在指针转换和数值转换时用到的非常多。只要编写程序的人知道自己要做什么转换,并知道应该怎样转换的话,我认为上边的转换方式非常之好。但是没有清楚的了解每个转换的细节的话,就有可能出现问题,比如指针指向不应该指向的区域:出现野指针或者指向位置错误(主要是对内存结构不了解),或者计算数值被截去等问题发生。
C++程序兼容C语言的转化,但是针对面向对象语言的特性,设计了以下几个类型转换操作符。他们的出现是为了C语言类型转换中语义模糊和固有的危险陷阱,因为C语言不去判断所要操作的类型转换是否合理。
static_cast:用于非多态类型的转换。
dynamic_cast:用于多态类型的转换。
const_cast:用来消除const, volatile, __unaligned属性的转换。
reinterpret_cast:用于空间的重新解释。
还有一个在VS2005中出现的类型转换关键字safe_cast.#2
static_cast:
static_cast(expression)
这个关键字可以用来将一个指针转换为父类的指针也可以转换为子类的指针或者基本的类型转换。但是这种转换是强制的,并没有任何运行时类型检查来保证转换的正确性,所以编写代码的人需要明白自己所进行的转换是否合理。
//基本类型的转换
enum e { A = 1, B, C };
double d = 12.25;
unsigned int ui = 25;
char c = static_cast(ui);
int i = static_cast(d);
int j = static_cast(B);
//父类子类转换
class F //father
{
public:
int _father;
};
class S : public F //son
{
public:
_son;
};
F *pFather = new F();
S *pSon = new S();
F *pF;
S *pS;
pF = static_cast(pSon); //将子类指针转换为父类指针,OK
pS = static_cast(pFather); //将父类指针转换为子类指针,错误
第二个错误的转换不是说编译器编译不过去,而是运行时会出现错误。
原因如下:假设pF指向了pSon的位置,它可以访问_father,它找不到_son,这样没有问题。但是pS指向了pFather的位置,它访问_father没有问题,但是访问_son时就会产生错误,因为pFather根本没有_son这个变量。
下面是将父类转换为子类指针时,static_cast和dymanic_cast两者不同的表现:
class F
{
public:
virtual void speak(){};
int i;
};
class S : public F
{
public:
void speak()
{
cout
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?