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编程练习 有时间就做
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编程练习 有时间就做
相关文章推荐
- 《C++ Primer Plus》第8章 函数探幽 学习笔记
- 【读书笔记:C++ primer plus 第六版 中文版】第8章 函数探幽
- 【学习笔记】C++primer plus 8.函数探幽
- C++ Primer Plus学习:第八章 函数探幽(1)
- 《C++ Primer Plus(第六版)》(12)(第八章 函数探幽 编程题答案)
- 《C++ Primer Plus(第六版)》(11)(第八章 函数探幽 复习题答案)
- 2012/1/21 《C++ Primer Plus》第八章:函数探幽 学习笔记
- 学习C++Primer Plus 函数探幽总结
- 学习C++.Primer.Plus 8 函数探幽
- 【C++ Primer plus】【第八章】函数探幽
- 2012/1/21 《C++ Primer Plus》第八章:函数探幽 学习笔记
- C++PrimerPlus第八章学习笔记——函数探幽
- C++ Primer Plus学习:第八章 函数探幽(2)
- 《C++ Primer Plus(第六版)》(10)(第八章 函数探幽 笔记)
- C++ Primer plus 学习笔记之第八章函数探幽(1)
- C++ Primer Plus 学习笔记之函数探幽----1
- C++ Primer Plus学习笔记之STL函数对象
- 《C++ Primer Plus》第7章 函数——C++的编程模块 学习笔记
- 【读书笔记:C++ primer plus 第六版 中文版】第7章 函数---C++的编程模块
- C++primer plus第7-8章函数笔记