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

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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值