一、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. Scrapy爬虫框架之爬取校花网图片

    Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设 ...

  2. C# IsAssignableFrom与IsSubClassOf 判断匿名类是否继承父类

    public class Dog : Animal { public string name { get; set; } } public class Animal { public string i ...

  3. 适配器在JavaScript中的体现

    适配器设计模式在JavaScript中非常有用,在处理跨浏览器兼容问题.整合多个第三方SDK的调用,都可以看到它的身影. 其实在日常开发中,很多时候会不经意间写出符合某种设计模式的代码,毕竟设计模式就 ...

  4. SQL Server 问题之 排序规则(collation)冲突

    一.写在前面 最近公司进行开发环境升级,数据库也准备了一个新的服务器,一切准备好后开始数据迁移,采取的方式为对现有Database(现有服务器Windows Server 2003 + SQL Ser ...

  5. 20165329 Java实验二:面向对象编程

    实验内容: 面向对象程序设计-1 实验要求: 提交最后三个JUnit测试用例(正常情况,错误情况,边界情况)都通过的截图 实验步骤: 1.按照老师博客的要求新建一个MyUtil项目 在src内新建ja ...

  6. v8-su-root

    1.下载userdebug版本 2.设置模块打开develop options 3.勾选usb debugging 4.adb remount 5.解压SuperSU_N.7z(联系我索取)并push ...

  7. SPI子系统分析之二:数据结构【转】

    转自:http://www.cnblogs.com/jason-lu/articles/3164901.html 内核版本:3.9.5 spi_master struct spi_master用来描述 ...

  8. 25 个常用的 Linux iptables 规则【转】

    转自 25 个常用的 Linux iptables 规则 - 文章 - 伯乐在线http://blog.jobbole.com/108468/ # 1. 删除所有现有规则 iptables -F # ...

  9. Java集合Map与其子类回顾

    接10月12号昨天的笔记,今天继续回顾集合中的Map集合. 一.集合工具操作类Collections 问题:collection和collections的区别? 1.collection是单列集合的顶 ...

  10. 002_安装第三方APP好的站点及解除安全与隐私限制

    一.解除安全与隐私限制的任何来源. http://bbs.feng.com/read-htm-tid-10714286.html 接下来,我们就打开终端,然后输入以下命令:   sudo spctl ...