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年第一本书开始,不知不觉已经是第四本书了(帮朋友合写的书不算),每次写完之后都会说太累了,不想再写了,但是却又次次反悔,吞下食言的苦果.如果非要说第四本书的感受,那 ...
随机推荐
- 2048 swift
AppearanceProvider.swift import UIKit protocol AppearanceProviderProtocol:class { func tileColor(val ...
- [Android] 获取音频输出getOutput
每创建一个AudioTrack,代表需要新增一个输出实例,即需要根据音频流的的stream type,音频流的音轨数量,采样率,位宽等数据来重新构建buffer,而且输出的设备也可能会有变化,由于An ...
- POJ3267 The Cow Lexicon(dp)
题目链接. 分析: dp[i]表示母串从第i位起始的后缀所对应的最少去掉字母数. dp[i] = min(dp[i+res]+res-strlen(pa[j])); 其中res 为从第 i 位开始匹配 ...
- -_-#【Canvas】回弹
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Spark RDD Union
示例 Spark多个RDD(数据格式相同)“组合”为一个RDD 代码 from pyspark import SparkConf, SparkContext conf = SparkCon ...
- Intellij IDEA 14隐藏被排除的文件夹
被排除的文件和文件夹以红色显示了. 看着这东西,人一下子就不好了. 还好设置可以改回来. Project tab右上角齿轮,关闭“Show Excluded Files”即可.
- 如何使用SecureCRT连接vmware下ubuntu
配置SecureCrt 和 ubuntu1. 首先要明白什么是ssh?可以把ssh看做是telnet的加强版,telnet的密码和信息都是不加密的,而ssh则加密.2. 开启ubuntu上的ssh功能 ...
- DataTable排序(来自其他空间)
DataTable排序 DataRow[] rows = dataTable1.Select("", "ord asc"); DataTable t = Dat ...
- cf591A Wizards' Duel
A. Wizards' Duel time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 9月1日,请记得备好名片来PechaKucha Night和大家“闲聊” | Hi!设计
9月1日,请记得备好名片来PechaKucha Night和大家"闲聊" | Hi!设计 9月1日,请记得来PechaKucha Night和大家"闲聊"