读书人

C++ primer(8)-内联函数 引用变量 引

发布时间: 2013-10-10 14:14:51 作者: rapoo

C++ primer(八)--内联函数 引用变量 引用传递函数参数 函数重载/模板/模板具体化

一、内联函数

常规函数和内联函数的区别在于C++编译器如何将他们组合到程序中。编译过程的最终产品是可执行程序--由一组机器语言指令组成。运行程序时,操作系统将这些指令载入到计算机内存中,因此每条指令都有特定的内存地址。执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销。

有了内联函数,编译器使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来。内联函数的运行速度比常规函数快,但是代缴是需要占用更多的内存。

使用这项特性,必须采取下述措施之一:

在函数声明前加上关键字inline;在函数定义前加上关键字inline;

二、引用变量

引用是已定义的变量的别名。主要作用是用作函数的参数。通过将引用作参数,函数将使用原始数据,而不是副本。因此,除了指针之外,引用也为函数处理大型结构提供了一种非常方便的途径。

1)创建引用变量

int rats;

int & temp=rats;

&不是地址运算符,而是类型标示符的一部分。就像声明中的char* 指的是指向char的指针一样,int &指的是指向int的引用。

int rats=10;

int & temp=rats;

int * temp1=&rats;

不过引用必须在声明引用变量时进行初始化。引用更接近const指针,必须在创建时进行初始化,一旦与某个变量关联起来,就效忠于它。

int & temp=rats;

实际是下述代码的伪装表示:

int * const pr=&rats;

对于上述的引用变量temp,如果一个变量再为int wang=10;

temp=wang;

最终的结果是:temp还是指向rats,只不过这个时候rats的值为10,地址仍旧为rats,并不是和wang的地址一样。

再看下下面的代码:

template <typename T>T add(T a,T b){   return a+b;}.....int m=6;double x=10.2cout<<Add<double>(x,m)<<endl;
上述例子就是显示实例化的例子。

1)编译器选择使用哪个函数版本、

对于函数重载、函数模板和函数模板重载,C++需要一个定义良好的策略,来决定为函数调用使用哪一个函数定义,尤其是有多个参数时。这个过程称为重载解析,大体步骤:

创建候选函数列表。包括与被调用函数的名称相同的函数和模板函数使用候选函数列表创建可行函数列表。确定是否有最佳的可行函数。



读书人网 >C++

热点推荐