内置函数
C++提供一种提高效率的方法,即在编译时将所调用函数的代码直接嵌入到主调用函数中,而不是将流程转出去。这种嵌入到主调用函数中的函数称为内置函数(inline function)。
指定内置函数的方法很简单,只需在函数首行的左端加一个关键字inline即可。如:
#include <iostream>
using namespace std;
inline int max(int, int, int); // 声明函数,注意左端有inline
int main()
{
int i = 10, j = 20, k = 30, m;
m = max(i, j, k);
cout << "max = " << m << endl;
return 0;
}
inline int max(int a, int b, int c) // 定义max为内置函数
{
if (b > a) a = b;
if (c > a) a = c;
return a;
}
由于在定义函数时指定它为内置函数,因此编译系统在遇到函数调用“max(i, j, k)”时,就用max函数体的代码代替它,同时将实参代替行参。这样main函数中的“m = max(i, j, k);”就被置换成了:
if (j > i) i = j;
if (k > i) i = k;
m = i;
注意:可以在声明函数和定义函数时同时写inline,也可以只在其中一处声明inline。
一般将规模很小(一般为5个语句以下)且使用频繁的函数(如定时采集数据的函数)声明为内置函数。在函数规模很小的情况下,函数调用的时间开销可能相当于甚至超过执行函数本身的时间,把它定义为内置函数,可大大减少程序运行时间。
内置函数中不能包括复杂的控制语句,如循环语句和switch语句。
函数模板
函数模板实际上是建立一个通用函数,其函数类型和行参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。如:
#include <iostream>
using namespace std;
template <typename T> // 模板声明,其中T为类型参数
T max(T a, T b, T c) // 定义一个通用函数,用T做虚拟的类型名
{
if (b > a) a = b;
if (c > a) a = c;
return a;
}
int main()
{
int i = max(1, 2, 3); // 调用模板函数,此时T被int取代
double j = max(1.2, 2.3, 3.5); // 调用模板函数,此时T被double取代
cout << "i_max : " << i << endl;
cout << "d_max : " << j << endl;
return 0;
}
template的含义是“模板”,尖括号中先写关键字typename,后面跟一个类型参数T,这个类型参数实际上是一个虚拟的类型名,表示模板中出现的T是一个类型名,但是现在并未指定它是哪一种具体的类型。
类型参数可以不只一个,可以根据需要确定个数,如:
template <typename T1, typename T2>
变量的存储类别
静态存储方式是指在程序运行期间,系统对变量分配固定的存储空间。
动态存储方式是指在程序运行期间,系统对变量动态地分配存储空间。
数据分别存放在静态存储区和动态存储区中。全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储单元,程序执行完毕就释放这些空间。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。
在动态存储区中存放以下数据:1.函数行参。在调用函数时给行参分配存储空间。2.函数中的自动变量。3.函数调用时的现场保护和返回地址等。
在C++中变量除了有数据类型的属性之外,还有存储类别的属性。存储类别指的是在内存中存储的方法。存储方法分为静态存储和动态存储两大类。具体包含4种:自动的(auto)、静态的(static)、寄存器的(register)和外部的(extern)。
自动变量:自动变量用关键字auto作存储类别的声明。变量默认都是自动变量,即auto int a = 3; 和int a = 3;作用相同。
用static声明静态局部变量:有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量保留上一次函数调用结束时的值。这时就应该指定该局部变量为静态局部变量。如:
#include <iostream>
using namespace std;
int f(int a)
{
int b = 0;
static int c = 3; // 定义c为静态局部变量
b += 1;