我应该在 C++ 中何时/为什么使用 STATIC?
when/why should i use static in c++?
我找到了为什么/何时应该使用静态声明变量?,但标签是关于objective-c的。
当您使用静态时,我无法确定 c++ 和 objective-c 之间的使用细节是否有任何区别,那么我何时/为什么要在 c++ 中使用静态?
static
有几个独立的含义,具体取决于上下文。
void f() { ... }
static void g() { ... }
在这里,f
具有"外部链接",这意味着它的名称在其他翻译单元中可见。也就是说,在另一个源文件中,您可以void f();
,然后您可以调用函数f
。
另一方面,g
因为它被标记为static
,所以具有"内部联系"。可以从同一源文件中的代码调用它,但不能从另一个源文件调用它。
对象相同:
int i = 3; // external linkage
static int j = 4; // internal linkage
还有一个小复杂:你可以在函数中定义一个静态对象。
void f() {
static int i = 3;
std::cout << i << 'n';
++i;
}
在这里,i
没有联系。它仅在函数内部可见。它在第一次调用函数时初始化(如果未调用函数,则根本不会初始化(。因此,第一次调用f
时,它会将"3"写入控制台。在第二次调用时,它将写入"4",依此类推。使用析构函数理解对象的行为留给读者作为练习。
在类定义中,它是完全不同的。
class C {
public:
void f();
static void g();
int i;
static int j;
};
在这里,当您调用f
时,您必须在类型C
的对象上调用它,并且f
可以使用该对象的数据成员,也就是说,它可以查看和更改i
和j
。调用g
时,没有关联的对象。它仍然是C
的成员,所以它可以查看和更改j
,因为j
也不与任何对象相关联。只有一个j
,它由所有类型为C
的对象共享。
相关文章:
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 为什么异常不适用于 OSX 上的 gcc7 和 -static-libgcc?
- 为什么静态成员函数定义不能有关键字"static"?
- 涡轮增压 这个声明“int fun-name(static int)”在C++中是否有效,为什么
- 为什么当我尝试在类中创建数组时"invalid use of non-static data member"我会收到错误?
- 为什么"static mutable int n;"不允许进入C++?
- 有什么好处,为什么 gdb 与 MethodName AND MethodName::<static var 不同>
- 为什么static void method()const是编译错误
- 为什么 C++ 不接受函数定义中的 static 关键字
- 为什么一个文件中没有错误,另一个文件中没有错误 - "Non Static Member Reference mush be relative to specific object"
- 为什么运算符重载实现中的两个 Static 对象在 c++ 中始终相等
- 为什么以下代码编译良好,但使用static时链接显示错误
- 何时以及为什么要在constexpr中使用static
- 为什么我们能够在类定义中定义[static const int],而不能定义其他静态const类型
- 为什么在 C++ 中将函数作为参数传递给 pthread 时会出现"non-static member function"错误?
- 为什么不允许将类成员定义的' static '关键字放在命名空间范围内?
- 为什么在这个模板代码中需要static关键字?
- 为什么使用static、extern和不使用static声明的变量包含不同的值
- 为什么" 'static' may not be used when defining (as opposed to declaring) a static data member"?