您的位置:首页 > 编程语言 > C语言/C++

C++ Primer Plus 第8章 函数探幽

2014-05-22 11:22 337 查看
第八章 函数探幽

1.函数调用会存储当前内存地址,然后跳到目标函数的起始地址,函数执行完会回到调用函数内存地址。

而使用内联函数,编译器将使用相应的函数代码替换函数调用,无需跳到另一个位置执行代码再回来。

代价是占用更多内存

2.内联函数在声明和定义时在前面添加inline

3,声明引用时,要初始化,是变量的别名

4.引用经常作为函数参数,使函数作为调用函数的别名,称为按引用传递

5.当引用参数为const时,实参类型正确,不是左值;类型不正确,但可以转换成正确类型。这种情况下会生成一个临时变量,提供给形参

6,。对于临时变量,它是一个右值

7.使用引用或指针的原则:

对于使用传递的值而不作修改的函数:

如果是类型对象很小,如内置类型(如int),则使用按值传递

如果是数组,则使用指针,并声明const

如果是较大的结构,则使用const指针或const引用,以提高程序的效率

如果是类对象,则使用const引用

对于会修改传入参数的函数

如果是内置类型,则使用指针

如果是数组,则使用指针

如果是结构,使用引用或指针

如果类对象,则使用引用

8.默认参数,在函数声明时对参数赋值

必须从右向左添加默认值

9.函数重载

关键是函数的参数列表——也称为函数特征标 包括参数数目和参数类型

特征标下,类型引用和类型本身视为同一个特征标

函数匹配时,并不区分const或非const变量

使用函数重载,编译器会对同名函数进行名称修饰,根据原型中指定的形参类型对函数名进行加密

10函数模板

template<typename T> //typename可改为class,二者等价

typeName function(T,...)

最终的代码不包含任何模板,只包含为程序生成的实际函数

模板一般用于对不同类型使用同一个算法

显式具体化

对于一个函数名,非模板函数,模板函数或显式具体化函数以及其重载版本

显式具体化的原型和定义应在开头template<>

template <> void swap<int> (int,int)

要有自己的函数定义

非模板>具体化>常规模板 优先级

显式实例化

需要一个常规模板

对该模板实例化,声明前添加关键字template 函数名后添加<>,里面写上类型

如template void swap<int> (int,int)

根据模板,生成特定类型的函数

隐式实例化

调用模板函数则会生成一个函数定义

11。编译器如何选择函数版本

创建函数列表,同名的函数都会在表中

创建可选函数列表,要求参数都是能匹配的

确定最佳的可行函数,否则出错

12.对于如何选择最佳函数匹配,参看P289-P294

13.关键字decltype C++11新增 可代表模板类型运算后结果

14.后置返回类型

template<class T1,class T2>

auto gt(T1 x,T2,y) ->decltype(x + y)

{

...

return x + y;

}

8.8编程练习 有时间就做
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: