先看go语言里的一串代码:
package main
func test() []func(){
var funs []func()
for i:=0; i<2; i++ {
funs = append(funs,func(){
println(&i,i)
})
}
return funs
}
func main(){
funs:=test()
for _,f:=range funs{
f()
}
}
输出结果:
0xc042048000 2
0xc042048000 2
说明:
1,在这里,[]func()类型的函数数组funs定义在函数test()内部,是一个局部变量。
与C++不同,go语言中该局部分量是分配在堆上还是栈上,不需要程序员去关心见"go中变量分配内存在堆上还是栈上的说明"。
2,两次打印的结果一样,这个地方关于变量 i 有些不好理解。在C++98中,因为没有匿名函数,而且不能在函数中定义函数,所以一个函数数组存储的函数,无法像go语言那样动态指定,只能先在函数外定义好。那么,变量 i 就很好区分了。如下代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
typedef int (*LiaChua)();
int i =36;
int LiangTest1()
{
cout << &i<<" "<<i<<endl;
return 1;
}
int LiangTest2()
{
cout << &i<<" "<<i<<endl;
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
LiaChua funarry[10];
funarry[0] = LiangTest1;
i++;
funarry[1] = LiangTest2;
funarry[0]();
funarry[1]();
getchar();
return 0;
}
输出结果:
00419004 37
00419004 37
这里很容易看到变量 i 是同一个变量,所以打印的结果相同。
在C++11中,lambda函数的引入,可以支持匿名函数。如下代码:
网友评论