深入了解函数

内联函数

内联函数的编译代码与其他程序代码“内联”起来了。正常的函数调用情况是当执行到函数调用指令时,会存储指令的地址,然后复制函数的参数到栈堆中,程序调到被调用函数起点的内存单元,执行函数代码,然后再返回到地址被保存的指令处。而使用内联函数后,编译器将使用相应的代码代替函数调用,代价是需要占用更多的内存。

内联函数的使用

  • 在函数声明前加关键字 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引用。

对于修改调用函数中数据的函数:

  • 如果数据对象是数组,只能用指针。
  • 如果数据对象是结构,用指针或者引用。
  • 如果数据对象是类对象,使用引用。

默认参数

对于带参数列表的函数,必须从右向左添加默认值。
实参按从左到右的顺序依次被赋值给相应的形参,不能跳过任何参数。

函数重载

函数重载的关键是函数的参数列表——函数特征标。如果参数数目和/或参数类型不同,则特征标不同。

提示

  1. 编译器在检查函数特征标时,把类型引用和类型本身视为同一个特征标。
  2. 在特征标中,将非const值赋值给const变量是合法的,但反之则是非法的。
  3. 重载函数的返回类型可以不同,但特征标也必须不同。

函数模板

函数模板是通用的函数描述,它们使用泛型来定义函数,其中泛型可以用具体的类型(如 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 &);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值