C++学习 (四)——关于引用的一个小例子

昨天讲到引用,引用变量是可以作为左值对其赋值的,所以当一个函数的返回值是一个引用时,我们也可以对其赋值,所以看类似 f() =n 的表达不用太大惊小怪啦。

 

看看下面这段程序

 

#include <iostream>
using namespace std;

int& f()
{
    static int a = 2;
	cout<<"引用前先执行函数体,把我打印出来吧!";
	cout<<"a=   "<<a<<endl;
    return a;
}



int main()
{
    f() = 10;
	int &b = f();

	cout << "f() = "<<f()<<endl;	
	cout << "b=  " <<b<<endl;
    return 0;
}

 

虽然我上面已经有了中文提示,但是很多人都很难一下子想到正确的输出结果,如下图所示

哈哈,有些小惊讶有木有。

我们现代分析一下函数,函数中有一个static关键子修饰的局部静态变量a。所以a在内存中是存在于静态区的,并且只能惟一地被 f() 函数访问。由于它不属于栈变量,因此函数返回释放栈空间时,a不会被释放,下次被访问时依旧能够保留原值。

而 f()函数的功能,其实就是对静态局部变量a 引用,产生一个别名 f( ),对f( )进行赋值,等价于对a进行赋值。

所以

a= 10; f () =10;  b = 10;这几个输出应该能理解了。

最后,为什么a会被打印这么多次呢?就像上面打印出来的“ 引用前先执行函数体”,编译器一见到 f(),就会执行其函数体,也就执行了它这个函数体,该次引用才能生效。所以出现了多少个 f() ,里面的内容就会被打印多少次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值