如何代码时间比调用时间长,则节省的时间只有一小部分;而如果代码很短,使用内敛函数可以节省函数调用的时间和开销。如:
inline double square(double x){return x*x}
C++中的引用,也相当于C中的地址。引用实际实现的方式如下:
int & rodents = rats;
等价于:int *const pr = &rats
;只不过编译器为我们隐藏了这样的细节。可以看出,pr 只能指向rats,指向的地址不能改变。
在使用函数时,引用作为参数和指针作为参数一样,如果只是使用变量的值,那么参数应该声明为const 修饰,这样不能在函数中修改参数值。
默认参数从右到左开始的。如char * left(const char *str,int n = 1);
函数重载的识别方法是:参数列表必须不同,但是返回值不能作为函数重载判断依据。
一个简单的声明语法是:
template <typedef T>
void Swap(T &a,T& b);
重载的关键是参数不同,而返回值不能作为判断重载的依据。
template <typedef T>
void Swap(T &a,T &b)
{
}
template <typedef T>
void Swap(T a[],T b[],int n)
{
}
如果T a T b ,a和b是一个数组,那么a = b不能直接赋值。
调用函数优先级:非模板 > 显示生成模板 > 模板生成版本
优先级总结就是:有限匹配不需要转换的函数。
template <> void Swap<job> (job &j1,job &j2);
实例化:template void Swap
显示具体化:template <> void Swap
实例化和显示具体化语法上区别是,显示具体化多了一个<> template <>
,记忆方式:显示具体化符号更多就更具体
template <class T1,class T2>
void ft(T1 x,T2 y)
{
type = x + y; // 那么x 和 y 是什么类型的呢?
}
于是decltype出现了,使用方式和场景。
long indeed(int);
decltype(indeed(int)) m; // m是一个long类型,不调用这个函数,而是根据函数的返回值类型判断的。
double xx = 4.4;
decltype ((xx)) r2 = xx // r2是一个double & 引用类型
int j=3;
int &k=j;
int &n=j;
decltype(j+6) i1; i1是int类型
decltype(100L) i2是long类型
decltype(k+n) i3; i3是int类型,根据k+n这个表达式判断的类型。
上边说的decltype可以在已有变量的情况下判断一些不方便的表示类型,但是如下情况下decltype也无法解决。
template
?type? gt(T1 x , T2 y)
{
return x+ y;
}
上边这种情况下使用decltype也无法实现。这种情况下,C++11结合decltype定义了一种新的函数声明方式
`double h(int x, float y);`
等价于
`auto h (int x,float y) -> double;
其中,->double被称为后置返回类型。其中是一个占位符,表示后置返回类型提供的类型,这是C++11给auto新增的一种角色。该句法结合decltype,函数定义如下:
auto gt(T1 x,T2 y) - > declttype(x+y)
{
return x + y;
}
这样就可以返回正确的值了。