从c到c++<四>
总结一下:内联函数实际上就是用inline修饰的函数,这些函数会在编译时由编译器来将代码展开,而不用像上面第二点提到的人工展开,它的使用场景:代码很短、使用频率高。
具体代码如下:
对于这两者实际上还是有区别的,如下面:
对于宏来说有它有两个作用:常量和带参数的宏(类似于函数调用)
C++推荐常量用const、enum来替换宏;带参数的宏由inline来替换。
所以在c++高层次编程中,推荐使用const、enum、inline替换宏;而在底层次编程中宏还是很灵活的。
- (T)expr
- T(expr)
- const_cast<T>(expr)
①、用来移除对象的常量性(cast away the constness)。
怎么来理解上面的话呢?下面用程序来进行说明:
既然val是常量,怎么可能将其转换为变量呢?这明显是矛盾的,而n跟val貌似没一点关系,val本身是无法改变的,那这个移除常量性貌似没一点意义,编译一下:
②、const_cast一般用于指针或者引用,所以下面来举例来说明:
编译运行:
接下来就可以用const_cast去除const限定:
那这时如果更改值,如下:
结果如下:
那指针p和&val是同一个地址么?
见证奇迹:
可见地址是一样的,为啥指针是同一个,而更改不了指针指向的内容呢?可以这样理解:*p这个会产生一个临时的空间,而更改它的内容实际更改的是临时空间的内容,而非val所指向的空间内容。
这就是第三点要说明的:
③、使用const_cast去除const限定的目的不是为了修改它的内容。
下面举一个引有的例子:
这个很显示应该会报错,跟指针一样:
如非要这样使用,这时则用cast_cast去除const限定:
输出结果:
其中val2的值也是不会被更改的,所以进一步说明const_cast不是为了修改它的内容。它的主要目的是下面这点:
④、使用const_cast去除const限定,通常是为了函数能够接受这个实际参数。
结合代码来理解:
这时就需要用到const_cast来解决:
再编译运行:
val2本来的值是100的,为啥是200呢?其实这里的实参应该是临时变量,而临时变量在上面改成了200,“refval2 = 200;”,所以传给形参时,数据就是200了。 - static_cast<T>(expr)
①、编译器隐式执行的任何类型转换都可以由static_cast完成。
所谓编译器隐式类型转换:也就是自动进行转换的,结合代码来说就是:
int a;
short b:
a = b;//它就是隐式转换,它可以由static_cast完成,但是一般不会这样做。
②、当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换,也就是显示转换,下面用代码说明下:
③、可以将void*指针转换为某一类型的指针。
④、可以将基类指针转成派生类指针。【这个在之后学习类的时候再说】
⑤、无法将const转化为nonconst,这个只有const_cast才可以办得到。 - reinterpret_cast<T>(expr) 【需要慎用它!】
- dynamic_cast<T>(expr)【这个是在派生类中进行转型的,等之后学到类再来学习】
执行“安全向下”转型操作,也就是说支持运行时识别指针或所指向的对象,这是唯一个无法用旧式语来进行的转型操作。
【注意】:
1、尽可能避免强制类型转换。
2、如果无法避,推荐使用新式类型转换。
从c到c++<四>的更多相关文章
- 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)
前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 简谈百度坐标反转至WGS84的三种思路
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域
一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)
从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...
随机推荐
- 【搬运】Visual Studio vs2017 vs2019 中文离线安装包下载,替代ISO镜像
原文地址[侵删]:https://blog.csdn.net/fromfire2/article/details/81104648 以下为搬运内容: 官档地址 https://docs.microso ...
- tab页签
<div class="fl" id="newsBox"> <div class="tab1 grayBar"> & ...
- 日常工作问题解决:redhat6.9--解决yum功能不能正常使用和配置yum源
1.问题描述 解决RedHat6.9下yum功能不能用问题: 在redhat6.9下使用yum安装时,会提示:This system is not registered to Red Hat Subs ...
- java poi3.10.1基本excel使用
效果: 代码: //时间 String checkTime = "yyyy/MM/dd"; //人员查询 Set preParticipantNames = new HashSet ...
- python爬虫框架scrapy 豆瓣实战
Scrapy 官方介绍是 An open source and collaborative framework for extracting the data you need from websit ...
- WUSTOJ 1282: Start(Java)
1282: Start 题目 判断一个字符串是不是回文串.例如:"abcba"是回文串.更多内容点击标题. 分析 水题,自己思考. 代码 /** * time 838ms ...
- Nginx学习笔记(三):Nginx 请求处理
Request Nginx 中的 ngx_http_request_t 是对一个 http 请求的封装: 一个 http 请求包含:请求行.请求头.请求体,响应行.响应头.响应体 Nginx 处理请求 ...
- Mariadb/Mysql 主从复制(1)
一.原理 mysql的主从数据同步是一个异步复制过程,需要master开启bin-log日志功能,bin-log记录了master库中的增.删.修改.更新操作的sql语句,整个过程需要开启3个线程,分 ...
- [Vue]Vue keep-alive
keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们.和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 ...
- (六)Spring Boot之日志配置-logback和log4j2
一.简介 支持日志框架:Java Util Logging, Log4J2 and Logback,默认是使用logback 配置方式: 默认配置文件配置 引用外部配置文件配置 二.默认配置文件配置( ...