8.1 内联函数
如何代码时间比调用时间长,则节省的时间只有一小部分;而如果代码很短,使用内敛函数可以节省函数调用的时间和开销。如:
inline double square(double x){return x*x}
- 内联函数与宏定义联系:
宏定义的两个缺陷:1. 容易出错。例如:#define QUARE(X) XX ,在使用宏时写成SQUARE(1.1+1.1) ,则出现这样的错误:1.1+1.1 * 1.1 + 1.1 ,正确的做法是:#define QUARE(X) ((X)(X)) 缺陷2:不能按值传递。SQUARE(C++) ,C会增加两次。
8.2 引用变量const
C++中的引用,也相当于C中的地址。引用实际实现的方式如下: int & rodents = rats; 等价于:int *const pr = &rats ;只不过编译器为我们隐藏了这样的细节。可以看出,pr 只能指向rats,指向的地址不能改变。 在使用函数时,引用作为参数和指针作为参数一样,如果只是使用变量的值,那么参数应该声明为const 修饰,这样不能在函数中修改参数值。
- 临时变量:
如果修饰类型不匹配,那么编译器就会生成一个匿名对象,如下两种情况下会生成,请看下图。
8.3 默认参数
默认参数从右到左开始的。如char * left(const char *str,int n = 1);
8.4 函数重载
函数重载的识别方法是:参数列表必须不同,但是返回值不能作为函数重载判断依据。
8.5 函数模板
一个简单的声明语法是:
template <typedef T>
void Swap(T &a,T& b);
8.5.1 模板重载
重载的关键是参数不同,而返回值不能作为判断重载的依据。
template <typedef T>
void Swap(T &a,T &b)
{
}
template <typedef T>
void Swap(T a[],T b[],int n)
{
}
8.5.2 模板的局限性
如果T a T b ,a和b是一个数组,那么a = b不能直接赋值。
8.5.3 显示具体化
调用函数优先级:非模板 > 显示生成模板 > 模板生成版本 优先级总结就是:有限匹配不需要转换的函数。
template <> void Swap<job> (job &j1,job &j2);
8.5.5 实例化和具体化
实例化:template void Swap<int>(int ,int ); 显示具体化:template <> void Swap<int>(int ,int); 实例化和显示具体化语法上区别是,显示具体化多了一个<> template <> ,记忆方式:显示具体化符号更多就更具体
8.5.6 模板的类型和decltype (C++)
template <class T1,class T2>
void ft(T1 x,T2 y)
{
type = x + y;
}
于是decltype出现了,使用方式和场景。
- 第一步:
double x delctype(x) w; w是一个double 类型 - 第二步:
long indeed(int);
decltype(indeed(int)) m;
double xx = 4.4;
decltype ((xx)) r2 = xx
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这个表达式判断的类型。
8.5.7 C++11 新增的数据函数声明方式
上边说的decltype可以在已有变量的情况下判断一些不方便的表示类型,但是如下情况下decltype也无法解决。 template <class x,class y>
?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;
}
这样就可以返回正确的值了。
|