第八章--函数进阶
内联函数:
在函数声明和函数定义前加上inline
一个简单的计算平方的代码:
1 #include <iostream> 2 using namespace std; 3 inline double square(double x) 4 { 5 return x * x; 6 }; 7 int main() 8 { 9 cout << "HelloWorld" << endl; 10 double a, b; 11 double c = 13.0; 12 a = square(5.0); //a=25 13 b = square(4.5 + 7.5); //b=144 14 cout << a << " " << b << "\n"; 15 cout << square(c++) << "\n"; //c=169 16 cout << c << "\n"; //c=14 17 cin.get(); 18 return 0; 19 20 }
内联函数的使用:函数经常调用,函数体较小,不包含循环之类的
引用变量:
引用变量的主要用途是用作函数的形参
int apple;
int & banana = apple; //banana是apple的引用变量
在这里&不是指针的地址运算符。banana和apple指向相同的值和内存单元
引用变量必须声明是初始化,而不是先声明在赋值
int & banana; //先声明引用变量
banana = apple; //在赋值。非法的
函数模板的局限性:
template <class T>
void f(T a, T b){...}
a = b //如果T为数组,不成立
if(a > b) //如果T为结构,不成立
编写的模板很可能无法处理某些类型
函数模板显示具象化
一个结构体:
struct job
{
char name[40];
double salary;
int floor;
}
假设只需交换salary和floor成员,而不交换name成员
#include <iostream> //函数模板原型
template <typename T> void Swap(T &a, T &b); struct job { char name[40]; double salary; int floor; }; //explicit specialiation 显示具体化 template <> void Swap<job>(job &j1, job &j2); void Show(job &j); int main() { using namespace std; cout.precision(2); cout.setf(ios::fixed, ios::floatfield); int i = 10;
int j = 20; cout << i << " " << j << endl; Swap(i, j); cout << "Now i, j =" << i << "," << j << endl; job zhang = {"zhangsan", 55.0, 7}; job li = {"lisi", 66.0, 6}; cout << "Before job swapping:\n"; Show(zhang); Show(li); Swap(zhang, li); cout << "After job swappting:\n"; Show(zhang); Show(li); cin.get(); } template <typename T> void Swap(T &a, T &b) //交换普通变量 { T temp; temp = a; a = b; b = temp; } template <> void Swap<job>(job &j1, job &j2)//交换结构体的两个成员变量 { double t1; int t2; t1 = j1.salary; j1.salary = j2.salary; j2.salary = t1; t2 = j1.floor; j1.floor = j2.floor; j2.floor = t2; } void Show(job &j) { using namespace std; cout << j.name << ":" << j.salary << ":" << j.floor << endl; cout << endl; }
隐式实例化、现式实例化(explicit instantiation)、显式具体化(explicit specialization)
显式实例化的声明:
template void Swap<int>(int, int);
Swap()模板将生成一个使用int类型的实例
显式具体化的声明:
template <> void Swap<int>(int &, int &);
template <> void Swap(int &, int &);
上面两行等价
1 template <class T> 2 3 void Swap(T &, T &);//模板原型 4 5 template <> void Swap<job>(char &, char &);//显示具体化 6 7 int main(void) 8 9 { 10 11 template void Swap<char>(char &, char &);//显式实例化 12 13 short a, b; 14 15 Swap(a, b);//隐式模板实例化 16 17 job n, m; 18 19 Swap(n, m);//显式模板具体化 20 21 char g, h; 22 23 Swap(g, h);//显式模板实例化 24 25 }