This question already has answers here:
Namespace + functions versus static methods on a class

(7个答案)


去年关闭。




我在头文件中有一堆函数(func1(),func2(),...),我想提供一些作用域。我知道2种实现:
  • class bunchOfFunctions
    {
    public:
    static void func1();
    static void func2();
    ...
    };
    
  • namespace bunchOfFunctions
    {
    void func1();
    void func2();
    ...
    };
    

  • 在这两个选项中,我都可以以相同的方式访问函数,即通过bunchOfFunctions::func()。我更喜欢使用命名空间方法(较少键入),但是我也在工作场所中看到了第一种实现方法。

    哪个选项更好?还有其他选择吗?

    最佳答案

    “更好”取决于您的定义。您在范围界定中寻找什么素质?这里没有一种适合所有答案的尺寸。但是,这两种方法都有一些特性:

  • 限定功能名称的必要性。
    对于类,您必须在以下情况下写bunchOfFunctions::func1()利用这些功能。同时, namespace 允许您提取
    一个带有using声明的函数
    using bunchOfFunctions::func1;
    

    并在大多数范围内使用不合格的产品。如果您希望,甚至可以使用using指令使 namespace 的所有成员可用于非限定名称查找。类没有等效的机制。
  • 别名。
    没有区别。给类写一个别名
    using BOF = bunchOfFunctions;
    

    而别名空间是用
    namespace BOF = bunchOfFunctions;
    
  • 隐私。
    一个类(class)可以有私有(private)成员。因此,您可以将函数声明放在私有(private)访问说明符下,并在公共(public)内联成员中使用它们。命名空间没有这种机制。取而代之的是,我们依靠约定并将声明放在“请勿触摸此”内部命名空间下,该命名空间通常称为bunchOfFunctions::detail
  • Argument dependent lookup
    C++具有一种机制,可以通过检查包含调用参数的 namespace 来从不合格的调用中查找函数声明。为此,该函数必须在实际的 namespace 中。类的静态成员无需进行此类查找。因此,对于您可能拥有的任何成员类型,只有 namespace 将允许通过ADL进行调用。

  • 这四个人不在我的脑海中。判断自己的需求。至于“还有其他选择吗?”,这是当今您必须在C++中对此类函数进行分组的仅有的两种方法。在C++ 20中,我们将有模块!这将为代码提供另一个层次的分组。

    关于c++ - 命名空间内的作用域与类内的作用域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56162462/

    10-11 21:57
    查看更多