静态成员与静态全局
Static member vs static global
我读到全局变量和静态全局变量之间的区别在于,全局变量可以通过extern在另一个实现文件中引用,而静态全局变量仅本地化到该实现文件。有关详细信息,请参阅以下两个问题:[1,2]。
据我所知,这意味着下面的foo()
和bar()
应该相同地链接。这两个函数只能由MyClass
使用。
//MyClass.h
Class MyClass{
private:
static void foo();
};
//MyClass.cpp
void MyClass::foo(){}
static void bar(){}
我可以看到foo()
的声明更常见,因为它可以让头文件更完整地布局整个类(即使你不能/不应该使用私有的东西),但声明bar()
这样的函数(隐藏在头文件中)是不是不好?
就上下文而言,我为windows消息定义了一个WNDPROC
,它需要是静态的才能工作,但这是一个相当丑陋的声明,我不确定是应该将其完全隐藏在实现文件中,还是继续在头文件中声明。
static是一个非常可怕的关键字,因为它根据上下文有很多不同的含义。静态变量和静态函数完全不同,类中的静态函数和静态自由函数完全不同。
类中的静态函数意味着可以在没有类实例的情况下调用该函数,但它不能访问类的非静态成员。它有点像一个正则函数,只是为了整洁起见而被封装在类中。
静态自由函数具有内部链接,因此在源文件之外看不到它,并且它的名称可以在其他源文件中重复使用。
静态类函数没有内部链接。所有类函数都有外部链接。无论类函数是否静态,都可以在头文件和源文件之间拆分类函数。
我建议您阅读一些教程/书籍,以便更清楚地了解static的许多不同用途。当你在一个你从未见过的地方看到静电时,不要想当然!
如果您有一个想要隐藏在源文件中的自由函数,您可以在这样做的时候将其声明为静态。或者,您可以将其放置在未命名的命名空间中。
// cpp file only
namespace
{
void hiddenfunc() {..}
}
这类似于
static void hiddenfunc();
它也可以用同样的方式调用(就像"hiddenfunc()"一样)。未命名名称空间(我知道这个名称很奇怪)的一个优点是,您还可以放置类和其他定义,只希望在源文件中可见。只需确保在命名空间{..}区域中定义函数体即可。不要在头文件中放入未命名的命名空间。
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 全局静态生存期?他们会让你的程序崩溃吗?
- C++如何使用虚拟基类型声明全局静态分配的变量
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 全局静态变量不"staying defined"函数外部
- 为什么不调用全局静态变量的析构函数
- 全局静态变量阴影
- std::初始值设定项列表全局/静态对象的生存期
- 全局(静态编译的)变量位于哪里
- 可以静态访问全局静态变量的静态函数
- 解决由全局静态变量引起的内存问题
- 全局静态常量字符串不会初始化
- 包含数据的全局静态类
- 分配给 cpp 中定义的全局静态变量的内存是否在 C++ 中删除其类的实例后释放
- 我们可以将全局静态变量视为全局变量吗?
- C++-全局静态对象和本地静态对象的构造函数调用不同
- C++从全局静态函数中引用对象
- 全局静态常量shared_ptr被另一个shared_ptr的析构函数奇怪地窃取和删除,为什么?
- 如何查找全局静态初始化
- 离开 c++ 应用程序而不运行全局静态对象的析构函数