C++ VWhat是C+中成员函数内声明的静态的可见性+;?

C++ VWhat是C+中成员函数内声明的静态的可见性+;?,c++,static,C++,Static,因此,我明白: 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 &th

因此,我明白:

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
访问


我在实际代码中看到过这种模式,因此想知道它是如何工作的。

在C++中有两个重要的概念:和变量

我如何接触弗雷德和巴尼?我知道它们只创建了一次,并且在程序的生命周期中都存在,但它们可能无法作为Foo::barney访问

您无法访问它们(至少不能通过它们的名称,因为编译器无法链接它们,因为它们没有链接)。成员函数内的静态变量仅在函数内可见;程序的生存期(确切地说,它从程序流第一次遇到声明时开始,并在程序终止时结束)和

static
变量用于单例设计模式。因为它们的可见性有限,但程序的生命周期有限,所以您可以在成员函数之外访问静态变量

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

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

在C++中有两个重要的概念:和变量

我如何接触弗雷德和巴尼?我知道它们只创建了一次,并且在程序的生命周期中都存在,但它们可能无法作为Foo::barney访问

您无法访问它们(至少不能通过它们的名称,因为编译器无法链接它们,因为它们没有链接)。成员函数内的静态变量仅在函数内可见;程序的生存期(确切地说,它从程序流第一次遇到声明时开始,并在程序终止时结束)和

static
变量用于单例设计模式。因为它们的可见性有限,但程序的生命周期有限,所以您可以在成员函数之外访问静态变量

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

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

与任何其他局部变量一样,它们只能从bar()函数中进行局部访问。最大的区别在于,它们是在Ze上初始化的,并通过多次调用bar()来持久化。谢谢——这是最简单、最明显的答案,但我想知道我是否遗漏了什么。但是如果创建了多个foo会发生什么呢?@adrianmcmenamin会发生什么,比如什么?没有什么变化。没有理由改变行为:实例与
static
无关。变量仅在其声明的范围内可见。那么让我们假设变量已初始化为一天中的某个时间-它们将具有什么值-在所有Foo实例上相同(如果它们是静态成员),或者不同-如果它们是autos?
bar()
是静态的-因此您不需要使用任何实例来调用它。如果
bar()
不是静态的,则调用
bar()
时,
Foo
的所有实例都将访问相同的
fred
等变量。它们与任何其他局部变量一样,只能从bar()函数中本地访问。最大的区别在于,它们是在Ze上初始化的,并通过多次调用bar()来持久化。谢谢——这是最简单、最明显的答案,但我想知道我是否遗漏了什么。但是如果创建了多个foo会发生什么呢?@adrianmcmenamin会发生什么,比如什么?没有什么变化。没有理由改变行为:实例与
static
无关。变量仅在其声明的范围内可见。那么让我们假设变量已初始化为一天中的某个时间-它们将具有什么值-在所有Foo实例上相同(如果它们是静态成员),或者不同-如果它们是autos?
bar()
是静态的-因此您不需要使用任何实例来调用它。如果
bar()
不是静态的,则调用
bar()
时,
Foo
的所有实例将访问相同的
fred
等变量。