深入了解函数

内联函数

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

内联函数的使用

  • 在函数声明前加关键字 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
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值