内联函数
运行速度快,但是占用内存多
使用方法:在函数声明最前面加上inline,例如:inline double sq(double x){return x*x;}
宏与内联函数类似
引用变量
引用变量=别名
创建:int rats;
int &rodents = rats;
操作引用变量会影响两个变量
声明引用变量时必须初始化,一旦初始化从头到尾不能改变,类似const指针
作为函数参数传递可以修改变量的值,称为按引用传递
区分传递引用和传递指针:
(1)传递指针必须使用变量前面加*解引用
(2)申明方式不同:int fun(int &a) int fun(int *a)
对象 继承 引用
使用引用参数的两个原因
(1)程序员能够修改调用函数中的数据对象。
(2)通过传递引用而不是整个数据对象,可以提高程序的运行速度。
对于使用传递的值而不修改,指导原则:
(1)数据很小,按值传递。
(2)数据是数组,使用指针,将指针声明为指向const的指针。
(3)数据是较大的结构,使用const指针或const引用,提高效率。
(4)数据是类对象,使用const引用。
对于修改调用函数中数据的函数:
(1)如果数据对象是内置数据类型,则使用指针。
(2)如果数据对象是数组,则使用指针。
(3)如果数据对象是结构,则使用引用或指针。
(4)如果数据对象是类对象,则使用引用。
默认参数:没有参数就默认值,有传入参数则使用传入参数。
函数重载
如果函数有两个原型,一个用于const指针,一个不用,编译器将根据实参是否为const来决定用哪个原型
重载引用参数示例:
void staff(double &rs)
void staff(const double &rcs);
void stove(double &r1);
void stove(const double &r2);
void stove(double && r3);
double x =55.5;
const double y = 32.0;
stove(x);//stove(double &)
stove(y);//stove(const double &)
stove(x+y);//stvoe(double &&)
函数模板
template
void Swap(AnyType &a,AnyType &b){}
关键字template和typename是必须的,除非使用class代替typename
每次使用模板必须在前面加上template
显示具体化
struct job{}'
template<>void Swap(job &,job&){}
显示实例化
template void Swap(int,int)
例如:
int m =5;
double x =14.3;
Add(m,x);
调用优先级:普通函数>显示具体化>显示实例化>普通模板
显示实例化用于人为选择特定的类型
显示具体化用于修改某类型的函数具体功能(拓展模板的应用范围,如数组/struct)
decltype
decltype(x) y;//y的类型和x一样
使用示例:
template<class T1,class T2>
void ft(T1 x,T2 y)
{
....
typedef decltype(x+y) xytpye;
xytpye xpy = x+y;
xytpye arr[10];
xytpye & rxy = arr[2];
...
}
还可以:
template<class T1,class T2>
auto gt(T1 x,T2 y)->decltype(x+y)
{
...
return x+y;
}