【C++ Primer Plus(第六版)】第八章-函数探幽总结

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 修饰,这样不能在函数中修改参数值。

  • 临时变量:
    如果修饰类型不匹配,那么编译器就会生成一个匿名对象,如下两种情况下会生成,请看下图。

【C++ Primer Plus(第六版)】第八章-函数探幽总结_第1张图片

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 );
显示具体化:template <> void Swap(int ,int);
实例化和显示具体化语法上区别是,显示具体化多了一个<> template <>,记忆方式:显示具体化符号更多就更具体

8.5.6 模板的类型和decltype (C++)

template <class T1,class T2>
void ft(T1 x,T2 y)
{
	type = x + y;  // 那么x 和 y 是什么类型的呢?
}

于是decltype出现了,使用方式和场景。

  • 第一步:
    double x
    delctype(x) w; w是一个double 类型
  • 第二步:
long indeed(int);
decltype(indeed(int))  m; // m是一个long类型,不调用这个函数,而是根据函数的返回值类型判断的。
  • 第三步:
double xx = 4.4;
decltype ((xx)) r2 = xx // r2是一个double & 引用类型
  • 第四步:与var类型相同
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

?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;
}

这样就可以返回正确的值了。

你可能感兴趣的:(C++,引用变量const,内联函数与宏定义,函数模板,显示具体化和实例化,新特性:decltype使用)