C++学习(八)——函数探幽
一、C++内联函数
内联函数调用时无需跳到另一个位置执行代码,而是直接将代码块替换到调用位置,因此运行速度更快。但代价是占用了更多的内存。在调用次数多,函数比较小时适用
要使用这项特性,必须采取下列措施
- 在函数声明前加上关键字inline
- 在函数定义前加上关键字inline
#include<iostream>
//an inline function definition
inline double square(double x){return x*x};
int main()
{
using namespace std;
double a,b;
double c = 13.0;
a=square(5.0);
cout << a << endl;
}
二、引用变量
引用是已定义变量的别名,主要用作函数的形参
1.创建引用变量
int rats;
int & rodents = rats;//引用更接近const指针
int * prodent = &rats;
&不是地址运算符,而是类型标识符的一部分,int &是int的引用,二个变量的地址相同
引用必须在声明的时候初始化,在改变引用时原始的值也会改变,但是地址不会变
2.按引用传递函数参数
允许被调用的函数能够访问调用函数的变量
//两种方式都出现一次&
void swapr(int & a, int & b)
{
int temp;
temp = a;
a = b;
b = temp;
}
swapr(wallet1,wallet2);
void swapp(int * p, int * q);
swapp(&wallet1, &wallet2);
3.常量引用
const double &ra
形参中使用const能够生成并正确使用临时变量,因此,在不修改参数时,尽可能使用const
4.将引用用于结构
不要返回临时变量的引用或指针
struct free_throws
{
string name;
int made;
};
void set_pc(free_throws & ft);
free_throws & accumulate(free_throws & target, const free_throws & source);
5.将引用用于类对象
将类string、ostream、istream等类对象作为参数
6.对象、继承和引用
几类引用可以指向派生类对象,无需进行强制类型转换
void file_it(ostream & os,double fo);
file_it(cout,a);
file_it(fout,b);
7.何时使用引用
- 对于使用传递的值而不作修改的函数
- 数据很小:内置数据类型、小型结构,按值传递
- 数组,使用指针(const)
- 结构,使用const指针或者const引用
- 类对象,const引用
- 修改函数中数据的函数
- 内置数据类型,指针
- 数组,指针
- 结构,引用或指针
- 类对象,引用
三、默认参数
当函数调用中省略实参时自动默认的一个值
char * left(const char * str, int n = 1, int j = 5);
要为某个参数设置默认值,必须为他后面所有参数设置默认值实参按从右到左的顺序依次赋给形参
四、函数重载(函数多态)
能够使用多个同名的函数,关键是参数列表,返回值可以相同可以不同,但参数列表必须不同,形参中是否有引用视做同一种
unsigned long left(unsigned long num, unsigned ct);
char * left(const char* str, int n);
五、函数模板
template<typename AnyType>
void Swap(AnyType &a, AnyType &b)
{
AnyType temp;
temp = a;
a = b;
b = temp;
}
关键字template和typename必选,typename可以使用class代替,AnyType一般直接写为T
详情见funtemp.cpp
常见的情形是把模板放在头文件中
1. 重载的模板
template<typename T>
void Swap(T *a, T *b, int n);
emplate<typename AnyType>
void Swap(AnyType &a, AnyType &b);
2. 显示具体化
当模板的使用受限时,例如struct想交换某些特定成员,可以使用显示具体化,当编译器找到与函数调用匹配的具体化定义是,将适用该定义,不再找模板
template<> void Swap<job>(job &, job &); // <job可以去掉
非模板>显示具体化>模板