V Какова видимость статики, объявленной внутри функции-члена в C ++? - PullRequest
1 голос
/ 30 апреля 2020

Итак, я понимаю, что:

class Foo {
    public:
    static int bar;
}

Означает, что я могу получить доступ к Foo::bar более или менее в любом месте.

Но как насчет такого кода?

class Foo {
    public:
    static int* bar() {
        static int fred = 1;
        static int barney = 2;
        static int thelma = 3;
        return &thelma;
   }
};

Как мне получить доступ к fred и barney? Я понимаю, что они создаются только один раз и существуют на протяжении всей жизни программы, но, вероятно, они недоступны, поскольку Foo::barney.

Я видел этот шаблон в реальном коде и поэтому удивляюсь, как он работает.

1 Ответ

0 голосов
/ 30 апреля 2020

В C ++ существует два важных понятия: видимость и время жизни переменных.

Как получить доступ к Фреду и Барни? Я понимаю, что они создаются только один раз и существуют на протяжении всей жизни программы, но, вероятно, они недоступны как Foo :: barney.

Вы не можете получить к ним доступ (по крайней мере, через их имя как компилятор не сможет связать их, так как они не связаны). Stati c переменные внутри вашей функции-члена visibility только внутри функции; время жизни программы (точнее, она начинается в первый раз, когда поток программы встречает объявление и заканчивается при завершении программы) и внутренняя связь .

static переменная используется в шаблоне Singleton Design. Поскольку они имеют ограниченную видимость, но время жизни программы, вы можете получить доступ к переменной stati c вне функции-члена.

class A {
public:
    A& getInstance()
    {
        static A self;
        return self;
    }

     A(const A&) = delete;
     A& operator=(const A&) = delete;
private:
    A();
};
...