从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 ...
随机推荐
- H5本地存储(转)
H5本地存储 一.本地存储由来的背景 众所周知Html4时代Cookie的大小.格式.存储数据格式等限制,网站应用如果想在浏览器端存储用户的部分信息,那么只能借助于Cookie.但是 ...
- LinkedList的基本用法
LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用. 博客原文地址链接:http://blog.csdn.net/i_lovefish/article/details ...
- javascript策略模式的应用!
最近在看<JavaScript设计模式与开发实践>这本书,受益匪浅,小记录一下书中的各个demo,加深理解: 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替 ...
- windows和linux环境下使用google的glog日志库
一.概述 glog是google推出的一款轻量级c++开源日志框架,源码在github上,目前最新release版本是v0.3.5. githut地址:https://github.com/googl ...
- 用js实现菜单的下拉列表,实用又简单
下拉列表本可以用<select>配合<option>来写,方便得很.但是在前端中,好用的东西都有兼容,为了避免出现兼容性的问题,下拉列表用js写再合适不行了. <body ...
- go实现简单的tcp编程
服务端的代码 package main import ( "fmt" "net" ) func main () { fmt.Println("star ...
- Python开发【第三章】:文件操作
一.文件操作模式概述 1.打开文件的模式: r, 只读模式[默认] w,只写模式[不可读:不存在则创建:存在则删除内容:] a, 追加模式[不可读:不存在则创建:存在则只追加内容:] 2." ...
- Message高级特性
一.延迟和定时消息投递 1 xml中配置schedulerSupport属性为true 2 每小时都会发生消息被投递10次,延迟1秒开始,每次间隔1秒: TextMessage message = s ...
- 数据结构——java实现队列
顺序队列: 概念: 队列是一种先进先出的线性表,只允许在一端插入,另一端删除.允许插入的一端称为队尾,允许删除的一端称为队头 顺序队列的实现: import org.junit.jupiter.api ...
- js 监听键盘的enter键
// js 版本 window.onload=function(){ document.onkeydown=function(ev){ var event=ev ||event if(event.ke ...