为什么将方法局部静态变量绑定到类而不是实例?

问题描述 投票:0回答:2

在这个班上

struct A
{
    ...
    void method()
    {
        static x=0;
        x++;
        ...
    }
}

对于A的每个实例,对method()的调用将对所有实例增加x

我希望对于仅调用x的实例增加method(),而对于其他任何实例都不影响x。这有效地将方法局部静态变量绑定到该类,并且是一个附带问题:为什么我不能拥有类级别的静态变量(仅const的),我希望它表现得像当前方法局部静态变量那样。

我知道我可以用一些额外的代码来“解决”这个问题,但仍然想了解这种现象的原因。

一些想要查看行为的代码:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

inline void PRINTSTRING(const std::string &s) { std::cout << s; std::cout.flush(); }
template<typename...T> void say(T...t) { std::stringstream ss{}; (ss<<...<<t); PRINTSTRING(ss.str()); }
template<typename...T> std::string says(T...t) { std::stringstream ss{}; (ss<<...<<t); return ss.str(); }
template<typename...T> bool sayerr(T...t) { say("Error: ", t...); return false; }

struct A { std::string sa{"A"}; void who() { static int a=0; a++; say(says(sa, " a=", a, "\n")); }};

std::vector<A*> AList{};

void killas() { while (!AList.empty()) { auto it=AList.begin(); delete (*it); AList.erase(it); }}
A* newa(const std::string &s) { A *pA=new A; if (pA) { pA->sa=s; AList.push_back(pA); } return pA; }
void showas() { if (AList.empty()) say("-empty-\n"); else for (auto p:AList) p->who(); }

int main(int argc, const char *argv[])
{
    say("\ntesting if a static var in a method is bound to instance or to class ...\n\nexpect 'empty'\n");
    showas();
    newa("one"); newa("two"); newa("three"); newa("four"); newa("five");
    say("\nif bound to instance expect all 1's\n");
    showas();
    say("\nif bound to instance expect all 2's\n");
    showas();
    killas();
    return 0;
}
c++ class static instance
2个回答
0
投票

静态成员属于类而不是实例,方法本地静态也是如此。您只需要一个普通的班级私人成员即可。


0
投票

发现this,虽然没有解释行为的原因,但确实对其使用做了很好的描述。

© www.soinside.com 2019 - 2024. All rights reserved.