c++ primer plus阅读笔记6---内联函数引用变量

来源:互联网 发布:php命名空间的使用 编辑:程序博客网 时间:2024/05/17 06:47

1.内联函数
普通函数的调用过程中,在汇编层次看,首先将函数的返回地址压栈,然后call函数,跳转到函数的代码块去执行,完了之后从栈里弹出来返回地址。
内联函数不需要跳转到函数的代码块。在编译时,编译器就已经将函数代码和其他代码块“内联起来了,也就是编译器将使用相应的函数代码替换函数调用。”这样程序就无需跳转到另一个位置执行代码再跳回来,但是缺点是占用更多内存。
2.引用变量
引用变量在生命的时候必须将其初始化,主要作用是给函数传参。

int &rodents=rats;实际上下述代码的伪装表示:int  *const  pr=&rats;

等价于指针常量(只能指向一块内存,指向位置不能改变);
如果想用引用,又不想改变传递进去的参数的值,应该用常量引用,例如:

double refcube(const double &ra);//其实此时最好用值传递,当数据结构比较大(结构,类)时,使用引用传递很有必要

引用传递的限制:

//定义函数:double refcube(int &x);如果按照以下方式传递参数将是非法的:refcube(a+3.0);//非法,因为x只是个别名,不能这样赋值:x+3.0=5.0

返回引用:

int cube(int &a)  //返回不是引用{    return a*=a*a;  //用a保存其立方值}//如果此时调用:double sqrt3(cube(a));//则传递sqrt3的参数是传递的值,如果返回是引用,如下:int cube(int &a)  //返回不是引用{    return a*=a*a;  //用a保存其立方值}//则sqrt3的参数是引用,能直接将a一直传递到sqrt函数,这在传递大对象的时候很实用//返回引用应该注意:不能返回函数返回以后不存在的内存位置,比如:int & functionint a){int b=a;    //b分配在栈上,function函数返回后,b将不复存在return b;}//返回引用还可以这么用:int &functionint a,int b);function(3,4)=5;//因为function返回的是一个int的引用

我们来看一个有意思的代码:

int &function(int &a,int b){    a+=b;    return a;}int main(){    int a=5;    int b=6;    cout<<(function(a,b)=7)<<endl;//输出7,因为function函数返回的是一块内存的引用,然后将7赋值给这块内存    cout<<function(a,b)<<endl;//输出13,上一条语句已经将a指向的内存赋值为7了,参数传递相当于function(7,6)}

指针也可以达到以上的效果,代码应该这么写:

int *function(int *a,int b){    *a+=b;    return a;}int main(){    int a=5;    int b=6;    cout<<*function(&a,b)<<endl;    cout<<(*(function(&a,b))=7)<<endl;    cout<<*function(&a,b)<<endl;}

如果要返回引用,但是同时又不希望上述可以赋值的情况出现,可以这么做:

const int &function(int &a,int b){    a+=b;    return a;}

返回值是const,不可以修改,然后下边的这种赋值就是非法的

function(a,b)=5//非法

将引用用于对象:
来对比三个函数:

string version_1(const string &s1,const string &s2){    string temp=s2+s1+s2;    return temp;     //temp是version_1函数定义的局部变量,函数返回后temp会被回收,在main函数中会将temp复制到一个名称为result的内存单元}string &version_2(string &s1,const string &s2){    s1=s2+s1+s2;    return s2;//返回引用,没有问题,但是副作用是改变了输入的值(s1内存的内容)}string &version_3(string &s1,const string &s2){    string temp=s2+s1+s2;    return temp;//temp是局部变量,函数退出后会被回收,这里返回的是引用,主函数中试图操作一个已经被释放的内存块,会导致程序崩溃(segment fault)}
原创粉丝点击