gpt4 book ai didi

c++ - 静态成员与静态全局

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:51 26 4
gpt4 key购买 nike

我读到全局变量和静态全局变量之间的区别在于全局变量可以通过外部在另一个实现文件中引用,而静态全局变量仅本地化到该实现文件。有关详细信息,请参阅以下两个问题:[ 1 , 2 ].

据我了解,这意味着以下 foo()bar() 应该相同地链接。这两个函数只能由 MyClass 使用。

//MyClass.h
Class MyClass{
private:
static void foo();
};

//MyClass.cpp
void MyClass::foo(){}
static void bar(){}

我可以看到 foo() 的声明更常见,因为它让头文件更完整地布局整个类(即使你不能/不应该使用私有(private)的东西),但是声明一个像 bar() 这样的函数(在头文件中隐藏)是不好的做法吗?

对于上下文,我正在为需要静态才能工作的 Windows 消息定义一个 WNDPROC,但这是一个相当难看的声明,我不确定是否应该在实现中完全隐藏它文件或继续在头文件中声明它。

最佳答案

static 是一个非常糟糕的关键字,因为它根据上下文有许多不同的含义。静态变量和静态函数是完全不同的,类中的静态函数和静态自由函数是完全不同的。

类中的静态函数意味着该函数可以在没有类实例的情况下被调用,但它不能访问类的非静态成员。它有点像常规函数,只是出于整洁目的而包含在类中。

静态自由函数具有内部链接,因此在源文件之外看不到它,并且它的名称可以在其他源文件中重用。

静态类函数没有内部链接。所有类函数都有外部链接。无论类函数是否是静态的,您都可以在头文件和源文件之间拆分类函数。

我建议您阅读一些教程/书籍,以更清楚地了解静态的许多不同用途。当您在以前从未见过的地方看到静电时,不要假设!

如果您有一个您想隐藏在源文件中的自由函数,您可以像这样做一样将其声明为静态的。或者,您可以将它放在未命名的命名空间中。

// cpp file only
namespace
{
void hiddenfunc() {..}
}

这类似于

static void hiddenfunc();

并且可以用相同的方式调用它(就像“hiddenfunc()”)。未命名命名空间(我知道这是一个奇怪的名字)的一个优点是您还可以放置您只想在该源文件中可见的类和其他定义。只需确保在命名空间 {..} 区域内定义函数体即可。不要在头文件中放置未命名的命名空间。

关于c++ - 静态成员与静态全局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17928603/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com