如何在每次调用时为函数添加1?

时间:2013-12-05 10:51:51

标签: c++

第一次调用该函数时,它返回1.每隔一次调用它就会返回1 +上次调用时返回的数字。

int counter()
{
   return counter()++;
}

这有效吗?

4 个答案:

答案 0 :(得分:2)

听起来你想要一个static variable

int counter()
{
   static int count = 0;   // initialized only once across all calls
   return ++count;
}

答案 1 :(得分:2)

您可以使用static

int counter()
{
   static int counter = 0;
   return ++counter;
}

静态(在函数体上下文中)只是一个很好的关键字,它使变量基本上是全局的,但不是语义上的。所以你不能在函数之外使用它,但是它会被所有全局变量初始化(这意味着一旦接近起点)并且存储在其他全局变量的位置。

仅供记录,因为c++标签。您可以编写一个仿函数类,其中包含私有count变量和重载operator()。或者甚至可能是一个能够包装任何函数并计算其调用的模板。

另请注意,在您的尝试中,您递归调用counter,没有具有固定值的退出点。它永远不会完成(除非你将堆栈溢出计算为结束)。

答案 2 :(得分:0)

除了在函数中定义静态局部变量之外,您还可以定义一个静态类成员函数,该函数将增加同一个类的静态数据成员。例如

#include <iostream>

class Counter
{
public:
    static int Count() { return ( ++cnt ); }
    static int Reset() { return ( cnt = 0 ); }
private:
    static int cnt;
};

int Counter::cnt = 0;

int main()
{
   for ( int i = 0; i < 10; i++ ) std::cout << Counter::Count() << ' ';
   std::cout << std::endl;

   std::cout << "\nResetting the counter to " << Counter::Reset() << std::endl;

   for ( int i = 0; i < 10; i++ ) std::cout << Counter::Count() << ' ';
   std::cout << std::endl;
}

答案 3 :(得分:0)

如果使用C ++ 11,请使用std::function和可变lambda表达式:

#include <iostream>
#include <functional>

using namespace std;


int main()
{
    function<int()> func = [&]()
    {
        static int i = 1;
        return i++;
    };

    for(int i = 0; i < 10; i++)
        cout << func() << endl;
    return 0;
}