第八章 函数探幽

8.1 C++内联函数

  • 在函数声明前加上关键字inline
  • 在函数定义前加上关键字inline
    程序员请求将函数作为内联函数时,编译器并不一定会满足这种要求。它可能认为该函数过大或注意到函数调用了自己(内联函数不能递归),因此不将其作为内联函数;而有些编译器没有启用或实现这种特性

8.2 引用变量
引用变量的主要用途时用作函数的形参,通过将引用变量用作参数,函数将使用原始数据,而不是其副本

  • int & rodents = rats;
    int &指的是指向int的引用,上述引用声明将rat和rodents互换–它们指向相同的值和内存单元
    引用不同指针,主要差别时,必须在声明引用时将其初始化,而不能像指针那样,先声明,再赋值

-左值是什么?左值参数是可以被引用的数据对象,例如变量,数组元素,结果成员,引用和解除引用的指针。非左值包括字面常量和包含多项的表达式

  • 右值引用,这种引用可指向右值,是使用&&声明,主要目的是让库涉及人员能够提供有些操作的更有效实现

使用引用参数的原因:

  1. 程序员能够修改调用函数中的数据对象
  2. 通过传递引用而不是整个数据对象,可以提高程序的运行速度

值传递,指针传递,引用传递的适用条件:

  • 如果数据对象很小,如内置数据类型或小型结构,则按值传递
  • 如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针
  • 如果数据对象是较大的结构,则使用const指针或const引用,来提高程序的效率,这样可以节省复制结构所需的时间和空间
  • 如果数据对象是类对象,则使用const引用,类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因

8.3 默认参数

必须使用函数原型。由于编译器通过查看原型来了解函数所使用的参数数目,因此函数原型也必须将可能的默认参数告知程序。方法是将值赋给原型中的参数

char * left(const char * str , int n = 1);

对于带参数列表的函数,必须从右向左添加默认值。即要为某个参数设置默认值,则必须为它右边的所有参数提供默认值

int harpo(int n, int m = 4, int j = 5);

请注意,只有原型指定了默认值,函数定于与没有默认参数时完全相同

8.4 函数重载

函数多态是C++在C语言的基础上新增的功能,函数重载的关键是函数的参数列表—也被称为函数特征标。返回类型不同无法构成重载

8.5 函数模板

函数模板允许以任意类型的方式来定义函数
template
void Snap(AnyType &a, AnyType &b)
{
}
第一行指出,要建立一个模板,并将类型命名为AnyType,关键字template和typename是必需的,另外,必须使用尖括号

函数模板不能缩短可执行程序,使用模板的好处是,它使生成多个函数定义更简单,更可靠。常见情形是,将模板放在头文件中,并在需要使用模板的文件中包含头文件

第三代具体化

  • 对于给定的函数名,可以右非模板函数,模板函数和显式具体化模板函数以及它们的重载版本
  • 显示具体化的原型和定义应以template<>打头,并通过名称来指出类型
  • 具体化优先于常规模板,而非模板函数优于具体化和常规模板

void Swap(job &,job &);

template
void Swap(T &, T &);

template<> void Swap(job &, job &);

-编写模板函数时,一个问题是并非总能直到应在声明中使用那种类型,C++新增的关键字decltype提供了解决方案,例如
template<class T, class T>
void ft(T1 x, T2 y)
{
decltype(x+y) xpy = x + y;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值