C++拾遗(七)函数相关(2)
内联函数
内联函数与常规函数的区别在于:
1.常规函数:在执行调用指令时,先存储该指令的内存地址,将函数参数复制到堆栈,然后跳转到被调用函数起点的内存单元,执行函数,将返回值放 入寄存器,最后跳回到一开始被保存的指令处。
2.内联函数:编译器将函数调用替换为函数代码,不需要跳转,但是内存开销大。
PS:内联函数不能递归,内联函数的函数体不能过大。使用时在声明和定义的前面都要加上关键字 inline。
引用传值
当函数的参数为const引用时,编译器将在以下两种情况生成临时变量:
1.实参类型不匹配,但是可以转换为正确类型。
2.实参类型匹配,但不是左值。
使用临时变量时,行为与按值传递类似,原始数据不修改而使用临时变量。
PS:基类的引用可以指向派生类对象。
默认参数
默认参数在函数原型中给出,必须从右向左添加默认值。
函数重载
关键是参数列表不同,类型引用和类型在重载时被视为同一个特征标。
同时存在多个重载函数时,不能进行强制转换匹配。
重载函数在编译时将进行名称修饰,以区别不同的重载函数。
模板函数
这里的模板也称参数化类型。
类似交换两个任意类型变量的值:
template<class T>
void tSwap( T &a, T &b )
{
T temp;
temp = a;
a = b;
b = temp;
}
编译器将在编译时根据调用时使用的参数类型生成相应的函数。如使用 int,则将 T 替换成 int,生成一个函数。
这意味着模板并不能缩短最终编译的文件长度,它的好处在于安全地生成多个同样功能的函数以及减少手工编写代码量。
函数模板也可以重载,如:
template<class T>
void tSwap( T &a, T&b ); template<class T>
void tSwap( T *a, T *b, int n );
但是当参数列表形式相同,又想为特定的类型调用特定的函数时,可使用显示具体化或显示实例化:
//函数模板
template<class T>
void tSwap( T &a, T&b ); //显示具体化
template<> void tSwap<className>( className &A, className &B );
//或者
template<> void tSwap( className &A, className &B ); //显示实例化
template void tSwap<className>( className &A, className &B );
C++拾遗(七)函数相关(2)的更多相关文章
- javascript基础拾遗(七)
1.对象的继承__proto__ var Language = { name: 'program', score: 8.0, popular: function () { return this.sc ...
- C++拾遗(六)函数相关(1)
返回值 C++规定返回值不能是 数组.但可以是其它任何类型(包括结构体和对象). 通常,函数将返回值复制到指定的CPU寄存器或内存单元中,然后调用函数调用该内存单元的值. 函数原型 参数列表中可以不包 ...
- java多线程编程核心技术——第七章补漏拾遗
本章主要知识点: 1)线程组的使用 2)如何切换线程状态 3)SimpleDateFormat类与多线程的解决方法 4)如何处理线程异常. 这本书基本来到了终点,其实在第四章来说,核心(基础)的线程知 ...
- Html5与Css3知识点拾遗(七)
布局 实例:规范的命名和编排 <body> <div class="page"><!--page开始--> <header class=& ...
- 《JAVA多线程编程核心技术》 笔记:第七章:拾遗增补
一.线程的状态 1.1 状态种类及理解:(一共6个) 文字说明和理解: NEW状态:线程实例化后还从未执行start()方法时的状态: RUNNABLE状态:线程进入运行的状态: TERMINATED ...
- C++拾遗(七)——关联容器
关联容器(Associative containers)支持通过键来高效地查找和读取元素.两个基本的关联容器类型是 map 和set.map 的元素以键-值(key-value)对的形式组织:键用作元 ...
- 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文
阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 《LoadRunner12七天速成宝典》来了
看到自己的新书又要发行了,算算从09年第一本书开始,不知不觉已经是第四本书了(帮朋友合写的书不算),每次写完之后都会说太累了,不想再写了,但是却又次次反悔,吞下食言的苦果.如果非要说第四本书的感受,那 ...
随机推荐
- Jedis 一
//连接Jedis public Jedis getJedis(){ Jedis jedis = new Jedis("192.168.1.12",6379); //权限认证 // ...
- 构建高可用web站点学习(二)
web站点的缓存学习 缓存在web应用里面十分常见,也有各种各样的缓存,从请求开始一直到代码处理的阶段都可以采取缓存.下面就逐一介绍: 一.客户端缓存(浏览器和http方面) 前端页面缓存主要遵循ht ...
- 类似NL的update更新
update b set b.object_name=(select a.object_name from a where a.object_id=b.object_id); create table ...
- NodeJs安装与使用入门
一.NodeJs简介 NodeJS官网上的介绍: Node.js is a platform built on Chrome's JavaScript runtime for easily bui ...
- Bitwise AND of Numbers Range——LeetCode
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...
- 关于开发板不能ping通外网IP
最近在做远程监控的项目,打算用开发板给一个网站发送数据包.不过发现开发板只能ping通同一局域网内的ip,外网的ip不能ping通.纠结了半天发现是网关没有设置的原因.下面来说说如何解决这个问题. 首 ...
- 使用Windows驱动的虚拟打印机,打印Excel表格无表格线问题解决(2)
测试: 经前天的测试,最终还是没有明显的定夺到底是驱动的问题,还是打印机的问题.但是按照可能性来排查,最明显的一点就是其他测试环境不变的情况下增加一张图片,就可以打印出表格线,我始终觉得这里是突破点, ...
- java并发ThreadLocal
ThreadLocal 实际就是一个map,一个线程对应一个local对象,线程创建时候,threadlocal随着创建,线程死亡ThreadLocal对象随着消失. runnable可以共享数据,要 ...
- 修改ORACLE的语言参数
ALTER SYSTEM SET nls_territory = "CHINA" SCOPE=SPFILE; ALTER SYSTEM SET NLS_CURRENCY = '¥' ...
- HDU H204 阿牛的EOF牛肉串
阿牛的EOF牛肉串 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...