C++11强制类型转换
C++ 强制类型转换有四种关键字:static_cast、const_cast、reinterpret_cast和dynamic_cast。它们用于不同的情况和目的,比C语言的强制类型转换更清晰和安全。static_cast用于数据类型和继承关系类间的明确定义的转换,const_cast用于去掉或加上底层const,reinterpret_cast用于低级别的指针或整数的转换,dynamic_cast用于多态类间的转换.
static_cast
基本使用:
int a; static_cast<double>(a)使用范围:一般用于数据类型得强制转换,此外:
- 基类与派生类(上行转换,派生-->基类,下行转换不安全)
- 空指针转化为目标类型指针
- 任何类型表达法转为void类型
const_cast
强制去掉不能被修改的常数特性(只能是指针或引用,而不能是变量数值)
尽量不要使用。
const int a = 10;
const int * p = &a;
int *q;
q = const_cast<int *>(p);
reinterpret_cast
使用范围:
改变指针引用类型:
int *a = new int;
double *d = reinterpret_cast<double *>(a);
整型与指针引用类型的相互转换
dynamic_cast
特点:运行时转换,需要做类型检查
范围:
不能用于内置的基本数据类型的强制转换(static_cast)
成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL
使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过.类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义.这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表.只有定义了虚函数的类才有虚函数表。
在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
如下程序:
class Base{
void fun_a();
virtual void fun_b(); // 必须有一个虚函数才能被使用动态强制转换
}
class Derived:public Base{
void fun_c();
}
int main(){
Derived *p = new Base(); // error
Derived *p = static_cast<derived *>(new base); // compile true, but run error
p->fun_c();
Derived *p = dynamic_cast<derived *>(new base); // compile true, and p is NULL because call for function c not existed in Base class.
p->fun_c();
return 0;
}
C++11强制类型转换的更多相关文章
- python小白——进阶之路——day3天-———容器类型数据+Number类型强制类型转换
-->Number 部分 int : 整型 浮点型 布尔类型 纯数字字符串 float: 整型 浮点型 布尔类型 纯数字字符串 complex: 整型 浮点型 布 ...
- python 基础之自动类型转换和强制类型转换
一:自动类型转换 自动类型转换注意针对Number数据类型来说的 当2个不同类型的数据进行运算的时候,默认向更高精度转换 数据类型精度从低到高:bool int float complex #关于bo ...
- java的强制类型转换
java强制类型转换 详细连接https://www.cnblogs.com/kuangwong/p/6198862.html 在Java项目的实际开发和应用中,常常需要用到将对象转为String这 ...
- C++之强制类型转换
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- JAVA强制类型转换(转载+自己的感想) - stemon
JAVA强制类型转换(转载+自己的感想) - stemon 时间 2013-10-29 15:52:00 博客园-Java原文 http://www.cnblogs.com/stemon/p/33 ...
- 强制类型转换(int)、(int&)和(int*)的区别
我们先来看两行代码: float x=1.75,y=1.75; cout<<(int)x<<" "<<(int&)y<<en ...
- js字符串转换为数字的三种方法。(转换函数)(强制类型转换)(利用js变量弱类型转换)
js字符串转换为数字的三种方法.(转换函数)(强制类型转换)(利用js变量弱类型转换) 一.总结 js字符串转换为数字的三种方法(parseInt("1234blue"))(Num ...
- javascript的强制类型转换
1.toString (1)调用toString方法 Array是将数组中的每个元素字符串化,并使用逗号拼接起来 object返回的是内部属性[[Class]]的值,[object Object] n ...
- javascript之强制类型转换
在javascript中,常会发生强制类型转换的情况有以下几种 字符串拼接 var a = 1; var b = a + '1'; console.log(b); //11 ==运算符 var a = ...
- 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...
随机推荐
- 「进阶」缓解眼睛疲劳,防蓝光保护视力,关爱健康!- CareUEyes
软件官网地址:https://care-eyes.com/ 显示 对于显示页面来说 8 个模式下面都有对应的介绍说明,不再介绍.笔者建议软件调节之前,先退出软件,用系统自带的亮度调节,进入电源选项中进 ...
- algorithm learning for Leetcode (1)
Leetcode 算法学习(一) 前言:最近学校要求必须学习C++,着重提升技能板块.为了快速升级,我在GitHub上发现了一个开源的学习号召: https://labuladong.github.i ...
- github 开源项目安装
1.打开github 2.搜索相关项目 3.使用系统下载安装 4.执行 指令;git clone git://github.com/****.git
- 【Unity】拖动图片生成对应Image
写在前面 拼UI时会用到多个Image,一般操作是:①新建一个Image,②拖入Image用到的图片,③SetNativeSize,④关闭不必要的raycastTarget .为了能尽快拼完UI,我写 ...
- How to enable CIFS in kernel 4.9
kernel config 要打开这几项
- 如何启动MySQL?
参见链接:https://www.cnblogs.com/Yanjy-OnlyOne/p/12603117.html
- 安装mysql8.0
安装repo源 参考mysql官方文档 参考文章 redhat7通过yum安装mysql5.7.17教程:https://www.jb51.net/article/103676.htm mysql r ...
- python print 一个进度条
import time scale=100 print("执行开始".center(scale+28,'-')) start = time.perf_counter() for i ...
- 求pi
参考自:https://www.zhihu.com/question/402311979 由 \[\frac{\pi^4}{90}={\textstyle \sum_{n=1}^{\infty }} ...
- MAC下使用Wireshark调试chrome浏览器的HTTP/2流量
1.设置环境变量 mkdir ~/tls && touch ~/tls/sslkeylog.log #zsh echo "\nexport SSLKEYLOGFILE=~/t ...