美文网首页
数组作为函数的返回值【在go语言和C++的差别】

数组作为函数的返回值【在go语言和C++的差别】

作者: 太平小小草 | 来源:发表于2018-10-12 16:19 被阅读0次

    先看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函数的引入,可以支持匿名函数。如下代码:

    相关文章

      网友评论

          本文标题:数组作为函数的返回值【在go语言和C++的差别】

          本文链接:https://www.haomeiwen.com/subject/eokgaftx.html