admin 管理员组文章数量: 887006
深入了解函数
函数探幽
- 内联函数
- 内联函数的使用
- 引用变量
- 创建引用变量
- 将引用用作函数参数
- 引用的属性和特别之处
- 何时使用引用参数
- 默认参数
- 函数重载
- 函数模板
- 显示具体化
- 实例化和具体化
内联函数
内联函数的编译代码与其他程序代码“内联”起来了。正常的函数调用情况是当执行到函数调用指令时,会存储指令的地址,然后复制函数的参数到栈堆中,程序调到被调用函数起点的内存单元,执行函数代码,然后再返回到地址被保存的指令处。而使用内联函数后,编译器将使用相应的代码代替函数调用,代价是需要占用更多的内存。
内联函数的使用
- 在函数声明前加关键字 inline;
- 在函数定义前加关键字 inline;
通常做法是将整个函数定义放在本应提供原型的地方。
引用变量
创建引用变量
int rats;
int & rod = rats;//int & 指的是指向int的引用,必须在声明变量时进行初始化。//两者指向相同的值和内存单元。
将引用用作函数参数
void grump(int &x);
int main()
{int times = 20;//创建times变量,将值20赋给它,grump(times);
}void grump(int &x)//使x成为times的别名
{
...
}
引用的属性和特别之处
如果实参与引用参数不匹配,C++将生成临时变量。仅当参数为const引用时,C++才允许这样做,生成临时变量的两种情况:
- 实参的类型正确,但不是左值;
- 实参的类型不正确,但可以转化为正确的类型;
左值参数是可以被引用的数据对象,列如,变量、数组元素、结构成员、引用和解除引用的指针。左值是可以修改的,在赋值表达式中,左边的子表达式必须标识为一个可修改的内存块。
非左值包括字面常量(如10.0)(用引号括起的字符串除外)和包含多项的表达式。
实际上,对于形参为const引用的C++函数,如果实参不匹配,则其行为类似于按值传递,使用临时变量来存储值。
常规函数的返回值是右值,因为这种返回值位于临时内存单元中,运行到下一条语句时,它们可能就不存在了。
提示:不能对数组进行引用,因为数组无法当函数的参数。
何时使用引用参数
对于使用传递的值而不作修改的函数:
- 如果数据对象很小,则按值传递。
- 如果数据对象是数组,则使用指针,并将指针声明为const的指针。
- 如果数据对象是较大的结构,则使用const指针或者const引用。
- 如果数据对象是类对象,用const引用。
对于修改调用函数中数据的函数:
- 如果数据对象是数组,只能用指针。
- 如果数据对象是结构,用指针或者引用。
- 如果数据对象是类对象,使用引用。
默认参数
对于带参数列表的函数,必须从右向左添加默认值。
实参按从左到右的顺序依次被赋值给相应的形参,不能跳过任何参数。
函数重载
函数重载的关键是函数的参数列表——函数特征标。如果参数数目和/或参数类型不同,则特征标不同。
提示:
- 编译器在检查函数特征标时,把类型引用和类型本身视为同一个特征标。
- 在特征标中,将非const值赋值给const变量是合法的,但反之则是非法的。
- 重载函数的返回类型可以不同,但特征标也必须不同。
函数模板
函数模板是通用的函数描述,它们使用泛型来定义函数,其中泛型可以用具体的类型(如 int 或 double)替换。
模板定义:
template <typename T>//typename 可以用 class替代
void funcname(T 形参)
{
...
}
显示具体化
模板函数具有局限性,很可能无法处理某些类型。因此提供具体化函数定义:
- 对于给定的函数名,可以有非模板函数、模板函数和显示具体化模板函数以及它们的重载版本。
- 显示具体化模板的原型和定义应以template<>打头,并通过名称来指出类型。
- 具体化优先于常规模板,而非模板函数优于具体化和常规模板。
void Swap(job &, job &);//非模板函数原型template <typename T>//模板函数原型
void Swap(T &, T &);template <> void Swap<job>(job &, job &);//具体化原型
实例化和具体化
编译器使用模板为特定类型生成函数定义时,得到的是模板实例,这种是隐式实例化,而代码中包含函数模板本身并不会生成函数定义。
显示实例化:声明所需的种类——用<>符号指示类型,并在声明前加上关键字template:
template void Swap<int>(int, int);
编译器看到这个声明后会使用Swap()模板生成一个使用int类型的实例。
显示具体化:
template <> void Swap<int>(int &, int &);
template <> void Swap(int &, int &);
本文标签: 深入了解函数
版权声明:本文标题:深入了解函数 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732360871h1535176.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论