《C++PP》学习笔记6第八章函数探幽

130 阅读2分钟

内联函数

运行速度快,但是占用内存多

使用方法:在函数声明最前面加上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;

}