一、类型转换名称和语法

1.C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:

TYPE b = (TYPE)a   

2.C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。

    static_cast                静态类型转换。如int转换成char

reinterpreter_cast    重新解释类型

          dynamic_cast          命名上理解是动态类型转换。如子类和父类之间的多态类型转换。

    const_cast,            字面上理解就是去const属性。

4种类型转换的格式:

TYPE B = static_cast<TYPE> (a)  

二、类型转换一般性介绍

1)static_cast<>()  静态类型转换,编译的时c++编译器会做类型检查;基本类型能转换 但是不能转换指针类型

2)若不同类型之间,进行强制类型转换,用reinterpret_cast<>() 进行重新解释

3)一般性结论:

  1.C语言中  能隐式类型转换的,在c++中可用 static_cast<>()进行类型转换。因C++编译器在编译检查一般都能通过;

  2.C语言中不能隐式类型转换的,在c++中可以用 reinterpret_cast<>() 进行强行类型 解释。总结:static_cast<>()和reinterpret_cast<>() 基本上把C语言中的 强制类型转换给覆盖,reinterpret_cast<>()很难保证移植性。

4)dynamic_cast<>(),动态类型转换,安全的基类和子类之间转换;运行时类型检查

5)const_cast<>(),去除变量的只读属性 。

三、典型案例

1.static_cast用法和reinterpret_cast用法

void main01()
{
double dPi = 3.1415926; //1静态的类型转换: 在编译的时 进行基本类型的转换 能替代c风格的类型转换 可以进行一部分检查
int num1 = static_cast<int> (dPi); //c++的新式的类型转换运算符
int num2 = (int)dPi; //c语言的 旧式类型转换
int num3 = dPi; //隐士类型转换
cout << "num1:" << num1 << " num2:" << num2 << " num3:" << num3 << endl; char *p1 = "hello wangbaoming " ;
int *p2 = NULL;
p2 = (int *)p1; //2 基本类型能转换 但是不能转换指针类型
//p2 = static_cast<int *> (p1); //“static_cast”: 无法从“char *”转换为“int *” //3 可以使用 reinterpret_cast 进行重新解释
p2 = reinterpret_cast<int *> (p1);
cout << "p1 " << p1 << endl;
cout << "p2 " << p2 << endl; //4 一般性的结论: c语言中 能隐式类型转换的 在c++中可以用 static_cast<>()进行类型转换 //C++编译器在编译检查一般都能通过
//c语言中不能隐式类型转换的,在c++中可以用 reinterpret_cast<>() 进行强行类型 解释 system("pause");
return ;
}

  

2 .dynamic_cast用法和reinterpret_cast用法

class Animal
{
public:
virtual void cry() = 0;
}; class Dog : public Animal
{
public:
virtual void cry()
{
cout << "wangwang " << endl;
} void doSwim()
{
cout << "我要狗爬" << endl;
}
}; class Cat : public Animal
{
public:
virtual void cry()
{
cout << "miaomiao " << endl;
}
void doTree()
{
cout << "我要爬树" << endl;
} }; class Book
{
public:
void printP()
{
cout << price << endl;
} private:
int price; }; void ObjPlay(Animal *base)
{
base->cry();
Dog *pDog = dynamic_cast<Dog *>(base);
if (pDog != NULL)
{
pDog->cry();
pDog->doSwim();
} Cat *pCat = dynamic_cast<Cat *>(base);
if (pCat != NULL)
{
pCat->cry();
pCat->doTree();
}
}
void main02()
{
Animal *base = NULL; //1 可以把子类指针赋给 父类指针 但是反过来是不可以的 需要 如下转换
//pdog = base;
Dog *pDog = static_cast<Dog *> (base); //2 把base转换成其他 非动物相关的 err
//Book *book= static_cast<Book *> (base); //3 reinterpret_cast //可以强制类型转换
Book *book2= reinterpret_cast<Book *> (base); //4 dynamic_cast用法
ObjPlay(new Cat()); system("pause");
}

  

3.const_cast用法

//典型用法 把形参的只读属性去掉
void Opbuf(const char *p)
{
cout << p << endl;
char *p2 = const_cast<char*>(p);
p2[0] = 'b';
cout << p << endl;
} void main()
{
const char *p1 = "11111111111"; char *p2 = "22222222"; char *p3 = const_cast<char *>(p1);
char buf[100] = "aaaaaaaaaaaa"; Opbuf(buf); //要保证指针所执行的内存空间能修改才行 若不能修改 还是会引起程序异常
//Opbuf("dddddddddddsssssssssssssss"); system("pause");
}

  

 总结

结论1:程序员要清除的知道: 要转的变量,类型转换前是什么类型,类型转换后是什么类型。转换后有什么后果。

结论2:一般情况下,不建议进行类型转换;避免进行类型转换。

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

  1. 为C# as 类型转换及Assembly.LoadFrom埋坑!

    背景: 不久前,我发布了一个调试工具:发布:.NET开发人员必备的可视化调试工具(你值的拥有) 效果是这样的: 之后,有小部分用户反映,工具用不了(没反应或有异常)~~~ 然后,建议小部分用户换个电脑 ...

  2. c# 基础 object ,new操作符,类型转换

    参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...

  3. Struts2日期类型转换

    针对日期类java.util.Date进行类型转换,要求客户端使用"yyyy-MM-dd","yyyy/MM/dd"中的任意一种输入,并以"yyyy- ...

  4. 【.NET深呼吸】基础:自定义类型转换

    照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老TMD写技术有什么了不起的,人人都会写.后来老周想想,也确实,代码谁不会写,能写到有品位有感悟,就不容易做到.于是,老周接受了该朋友的建议 ...

  5. C++四种类型转换方式。

    类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...

  6. struts2类型转换

    1. Struts2中的类型转换 我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种.所以,我们需要类型转换! 在Struts2中,类型转换的概念除了用 ...

  7. C++_系列自学课程_第_11_课_类型转换_《C++ Primer 第四版》

    上次说了关于表达式的一些内容,说到还有一些关于数据类型转换的内容,今天我们接着八一八C++中的数据类型转换. 一.隐式类型转换 在表达式中,有些操作符可以对多种类型的操作数进行操作, 例如 + 操作符 ...

  8. Struts2入门(三)——数据类型转换

    一.前言 笔者一直觉得,学习一个知识点,你首先要明白,这东西是什么?有什么用?这样你才能了解.好了,不说废话. 1.1.类型转换为何存在?什么是类型转换? 在MVC框架中,都是属于表示层解决方案,都需 ...

  9. js条件判断时隐式类型转换

    Javascript 中,数字 0 为假,非0 均为真 在条件判断运算 == 中的转换规则是这样的: 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 ...

  10. JavaScript中数据类型转换总结

    JavaScript中数据类型转换总结 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = " ...

随机推荐

  1. python的一些基本概念知识和面试题

    对于机器学习算法工程师而言,Python是不可或缺的语言,它的优美与简洁令人无法自拔.那么你了解过Python编程面试题吗?从Python基础到网页爬虫你是否能全方位Hold住?今天,机器之心为读者们 ...

  2. LeetCode 575 Distribute Candies 解题报告

    题目要求 Given an integer array with even length, where different numbers in this array represent differ ...

  3. Android SDK 环境搭建

    Android SDK(Software Development Kit,软件开发工具包)提供了 Android API 库和开发工具构建,测试和调试应用程序.简单来讲,Android SDK 可以看 ...

  4. telnet测试端口的使用

    端口开启后会跳转到 :

  5. tomcat去掉项目名称

    进入tomcat的conf目录,查看server.xml,找到<Host></Host>,在里面添加<Context path="" docBase= ...

  6. DedeCMS后台500错误一种原因是不支持PHP5.3、5.4及以上版本

    我们在迁移网站的时候,可能会出现DedeCMS后台500错误,有可能是因为dedecms不支持PHP5.3.5.4及以上版本,这时我们要改动一些设置才能修复成功.跟着ytkah来修改配置文件吧.首先打 ...

  7. RN九宫格

    九宫格可以用两种方式来做,一种使用SectionList,是我的另外一篇博客,还有一种的纯代码计算,下面是效果图 代码如下: var Dimensions = require('Dimensions' ...

  8. Python3学习之路~3.1 函数基本语法及特性、返回值、参数、局部与全局变量

    1 函数基本语法及特性 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 语法定义: d ...

  9. JVM内存管理(转)

    转载出处:http://blog.csdn.net/wind5shy/article/details/8349559 模型 JVM运行时数据区域 JVM执行Java程序的过程中,会使用到各种数据区域, ...

  10. [sh]rm -rf*的防护和普通用户执行命令

    尽量用普通用户执行,因为普通用户无法删除root的文件,避免误删除 rm -rf 不可取, 尽量find+rm -rf 尽量cd && rm -rf * 加上逻辑 cd /tmp/re ...