一、static_cast

   static_cast,静态类型转换。

     下面,我举几个例子,大家就能清楚了。

int main(int argc, char const *argv[])
{
char c = 'o';
int a = (int)c;//相当于把c的acsill码赋值给了a double d = 3.1231231;
int b = (int)d; //上述两种转换都是C风格
//下面看看C++风格的类型转换 char c = 'o';
int a = static_cast<int>c; double d = 3.1231231;
int b = static_cast(int)d; return ;
}

  这种类型转换检查在编译期间完成的。如果强制转换在C中不能通过编译的,在C++中也不能通过编译。

char* s = “string”;
int* p = NULL; p = s;//这里在c语言中编译不能通过
p = static_cast<int>s;//当然在C++中也不能编译通过

  所以,总结一句话就是:凡是在C语言中能够进行隐式转换的,都能用static_cast进行转换。

  在C语言中,如果你想将上面的char* 转换为int* 还真没有什么办法。但是在C++中,提供了下面一个关键字,能够解决问题。

二、reinterpreter_cast

  reinterpreter_cast,重新解释类型

  现在,我们来看看上面不能进行转化的案例:

char* s = “string”;
int* p = NULL; p = s;
p = reinterpreter_cast<int>s; cout<<"p"<<p; //打印出s的地址

  当然,这个还可以這么玩:

#include<iostream>
using namespace std; class Tree {}; class Animal{
public:
virtual void cry() = ;
}; class Dog : public Animal{
public:
virtual void cry(){
cout << "汪汪" << endl;
} }; class Cat : public Animal{
public:
virtual void cry(){
cout << "喵喵" << endl;
}
}; void main(){
Dog d1;
Cat c1; Animal *pBase = NULL; pBase = &d1; pBase = static_cast<Animal *>(&d1); //让C++编译在编译的时候进行 类型检查 //强制类型转换
pBase = reinterpret_cast<Animal *>(&d1); {
Tree t1;
//pBase = static_cast<Animal *>(&t1); // C++编译器会做类型检查
pBase = reinterpret_cast<Animal *>(&t1); //reinterpret_cast 重新解释 ....强制类转换的味道
}
system("pause");
}

  总结之,reinterpreter_cast是一种强制类型转换的语法规则。

  通过 reinterpret_cast<>() 和 static_cast<>()把C语言的强制类型转换 都覆盖了。

三、dynamic_cast

  dynamic_cast,动态类型转换

  下面,我通过一段代码来看看,这个类型转换有什么用途:

class Animal{
public:
virtual void cry() = ;
}; class Dog : public Animal{
public:
virtual void cry(){cout << "汪汪" << endl;}
void doHome(){cout << "看家" << endl;}
}; class Cat : public Animal{
public:
virtual void cry(){cout << "喵喵" << endl;}
void doThing(){cout << "抓老鼠" << endl;}
}; void playObj(Animal *base){base->cry(); // 1有继承 2虚函数重写 3 父类指针 指向子类对象 发生多态} void main(){
Dog d1;
Cat c1; Animal *pBase = NULL;
pBase = &d1; pBase = static_cast<Animal *>(&d1); //让C++编译在编译的时候进行 类型检查
pBase = reinterpret_cast<Animal *>(&d1); //强制类型转换 playObj(&d1);
playObj(&c1); system("pause");
}

  我们知道,在playObj那里会发生多态,根据传来的不同类的对象,动态的调用属于自己的cry()函数。

  但是,我们现在想要这样需求:当传来的是Dog类对象,调用Dog类的doHome()方法;当传来的是Cat类的对象,调用Cat类的doThing()方法。现在,我们只知道在playObj()函数中会发生多态,动态判断传来的对象。想完成上述功能,就得利用C++提供的dynamic_cast()来动态解析传来的对象。

  下面,我们修改一下playOjb()函数,让其能够完成上述功能。

void playObj(Animal *base)
{
base->cry(); // 1有继承 2虚函数重写 3 父类指针 指向子类对象 ==>多态// dynamic_cast 运行时类型识别
Dog *pDog = dynamic_cast<Dog *>(base);//动态地将基类指针转换为不同类的对象
if (pDog != NULL){
pDog->doHome();
}
Cat *pCat = dynamic_cast<Cat *>(base); //父类对象 ===> 子类对象
if (pCat != NULL){
pCat->doThing();
}
}

  总结,dynamic_cast()主要完成的是,子类与父类之间类型的转换。

四、const_cast

  const_cast,常量类型转换

  简言之,取出const变量的只读属性

void printBuf(const char *  p){
//p[0] = 'Z'; 不能完成修改
char *p1 = NULL;//const char * ===> char * //把只读属性 去掉
p1 = const_cast<char *>(p); p1[] = 'Z' ; //通过p1 去修改了内存空间
cout << p << endl;
} void main(){
char buf[] = "aaaaaaaaafffffddd";
char *myp = "aaaaaaaaafffffddd"; //程序员 要确保 p所指向的内存空间 确实能修改 ;如果不能修改会带来灾难性后果
//printBuf (buf); 数据存放在常量区,不能完成修改 printBuf (myp);
system("pause");
}

C++下的强制转换类型的更多相关文章

  1. Web | JavaScript的引用数据类型强制转换类型

    我在这里主要的想提下的是JavaScript中的引用类型进行强制转换类型.因为对于基本数据类型的变换大多都是雷同的,很容易熟知,但是引用数据类型有一点小插曲. JavaScript的引用类型主要为对象 ...

  2. PHP强制转换类型

    PHP强制转换类型   获取数据类型 : 1.如果想查看某个表达式的值和类型,用var_dump(). 2.如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype().3.要查看某个类型 ...

  3. TypeError: Error #1034: 强制转换类型失败:无法将 mx.controls::DataGrid@9a7c0a1 转换为 spark.core.IViewport。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 mx.controls::DataGrid@9aa90a1 转换为 spark.core.IViewport. ...

  4. TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::MouseEvent@73b7cc1 转换为 mx.events.ItemClickEvent。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 flash.events::MouseEvent@73b7cc1 转换为 mx.events.ItemClick ...

  5. TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "" 转换为 Array. at mx.charts.series::LineSeries/ ...

  6. TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill。

    1.错误描述 TypeError: Error #1034: 强制转换类型失败:无法将 "0.49" 转换为 mx.graphics.IFill. at mx.charts.ser ...

  7. 简述Java变量和强制转换类型

    简述Java变量和强制转换类型 java变量 1. java变量 变量:顾名思义,就是在java执行程序过程中可以发生改变的量,就好比方程式中的未知数X一样. 变量的内存分配过程 int a ; // ...

  8. C++ 4 种具有更 为准确语义的新强制转换类型

    1. static_cast<T>() 可用于把指向A 的指针强制转换为指向B 的指针,其约束条件是类B必须是类A的子类.例如:A *obj = new B;B *b = static_c ...

  9. Flash Professional 报错 TypeError: Error #1034: 强制转换类型失败:无法将 xxxx@zzzz 转换为 yyy

    通常是因为xxx yyy 两个不同链接名的元件 使用了同一个属性名

随机推荐

  1. c# 生成随机N位数字串(每位都不重复)

    /// <summary> /// 生成随机数字窜 /// </summary> /// <param name="Digit">位数</ ...

  2. CSS3 transition过渡

    transition 属性是一个简写属性,用于设置四个过渡属性: transition: property duration timing-function delay; transition-pro ...

  3. 触发器Demo

    --mysql 触发器简单实例 --创建表1 )) ; --创建表2 )); --创建触发器,表一增加数据时,表二自动增加数据 create trigger t_afterinsert_on_tab1 ...

  4. vue写出放大镜的效果

    用vue写出放大镜查看图片的效果. 安装 npm install vue2.0-zoom 引入 import imgZoom from 'vue2.0-zoom' 组件 components: { i ...

  5. 【codeforces】【比赛题解】#915 Educational CF Round 36

    虽然最近打了很多场CF,也涨了很多分,但是好久没写CF的题解了. 前几次刚刚紫名的CF,太伤感情了,一下子就掉下来了,不懂你们Div.1. 珂学的那场我只做了第一题……悲伤. 这次的Education ...

  6. Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等

    http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...

  7. python基础--subprocess模块

    可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*           --废弃 commands.* ...

  8. ORA-12514: TNS:listener does not currently know of service …

    问题描述: 今天数据库查询时遇到问题,具体情形如下截图所示: 问题分析: 看错误明显是TNS监听有问题,要么配置错了,要么数据库没起来.但是当前数据库起来了,也能正常连接使用,因此 考虑被查询对象可能 ...

  9. 使用Netty4实现基本的消息分发

    示例工程代码 可从附件下载 具体的说明和用法在后面介绍 需求与目的 一个游戏服务端需要处理各种业务逻辑,每一种业务逻辑都对应着一个请求消息和一个响应消息.那么服务端需要把这些不同的消息自动分发到对应的 ...

  10. js字符串基本操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtm ...