一、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. phpcm nginx 伪静态文件

    rewrite ^/show-([0-9]+)-([0-9]+)-([0-9]+).html /index.php?m=content&c=index&a=show&catid ...

  2. HDU 1715 大斐波数 加法高精度

    解题报告:求 斐波那契数,不过这题的n的范围是1000,肯定是早就超过了的,所以要用到高精度,所以这题其实就是一个加法高精度的题. 我的做法 是写一个大数相加的函数,然后打表就是了,这里注意的就是每次 ...

  3. sql server 查询本周、本月所有天数的数据

    查询本月所有的天数: --本月所有的天数 ),) day from (),,)+'-01' day) t1, ( ) t2 ),) ),,)+'%' 查询本周所有的天数: ),,),) ),,),) ...

  4. python程序练习题集

    1.#输入a,b,c,d4个整数,计算a+b-c*d的结果 a=input("please input a nimber:") b=input("please input ...

  5. gradle 构建工具,与Ant Maven关系

    1   基本概念 gradle是一个基于Apache ant 和apache maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的xml.当前其支持 ...

  6. The Art of Memory Forensics-Windows取证(Virut样本取证)

    1.前言 The Art of Memory Forensics真是一本很棒的书籍,其中使用volatility对内存进行分析的描述可以辅助我们对更高级类的木马进行分析和取证,这里对书中的命令进行了笔 ...

  7. Centos 软连接和硬链接

    1.软链接: 建立软链接:ln -s /usr/local/node-v4.2.6-linux-x86/bin/node /usr/local/bin/node 解释:将/usr/local/node ...

  8. 数据库-mysql管理

    MySQL 管理 启动及关闭 MySQL 服务器 首先,我们需要通过以下命令来检查MySQL服务器是否启动: ps -ef | grep mysqld 如果MySql已经启动,以上命令将输出mysql ...

  9. C语言基础 - read()函数读取文本字节导致判断失误的问题

    工作了几个月,闲着没事又拿起了经典的C程序设计看了起来,看到字符计数一节时想到用read()去读文本作为字符输入,一切OK,直到行计数时问题出现 了,字符总计数没有问题,可行计算就是进行不了,思考了半 ...

  10. Linux下堆漏洞的利用机制

    1.保护机制 )) malloc_printerr (check_action, "corrupted double-linked list", P); 这个就是所谓的堆指针的ch ...