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
等变量。