命名空间和类之间的作用域

时间:2019-05-16 06:53:06

标签: c++

我在头文件中有一堆函数(func1(),func2(),...),我想提供一些作用域。我知道2种实现方式:

  1. class bunchOfFunctions
    {
    public:
    static void func1();
    static void func2();
    ...
    };
    
  2. namespace bunchOfFunctions
    {
    void func1();
    void func2();
    ...
    };
    

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

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

3 个答案:

答案 0 :(得分:3)

除StroryTeller突出显示的点之外,

传播:namespace可以传播到多个文件中,其中Class必须在单个位置定义。

可读性和可理解性:通常,开发人员对Class是什么和namespace是什么的固有理解。

答案 1 :(得分:2)

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

  1. 必须限定函数名称。
    对于课程,您必须在以下情况下写bunchOfFunctions::func1() 利用这些功能。同时,名称空间允许您提取 一个带有using声明的函数
    using bunchOfFunctions::func1;
    
    并在大多数范围内使用不合格的产品。如果您希望,甚至可以使用using指令使名称空间的所有成员可用于非限定名称查找。类没有等效的机制。
  2. 别名。
    没有区别。给类写一个别名
    using BOF = bunchOfFunctions;
    
    而别名空间是用
    namespace BOF = bunchOfFunctions;
    
  3. 隐私。
    一个班级可以有私人成员。因此,您可以将函数声明放在私有访问说明符下,并在公共内联成员中使用它们。命名空间没有这种机制。取而代之的是,我们依靠约定并将声明放在“请勿触摸此”内部命名空间下,该命名空间通常称为bunchOfFunctions::detail
  4. Argument dependent lookup
    C ++具有一种机制,可以通过检查包含调用的 arguments 的命名空间,从不合格的调用中查找函数声明。为此,该函数必须在实际的名称空间中。类的静态成员无需进行此类查找。因此,对于您可能拥有的任何 types 类型成员,只有名称空间将允许通过ADL进行调用。

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

答案 2 :(得分:0)

除了上面给出的信息外,我还要补充一点,回到类和名称空间是什么的标准定义可以帮助做出这样的决定。

  

名称空间是一个声明性区域,它为其内部的标识符(类型,函数,变量等的名称)提供范围。命名空间用于将代码组织到逻辑组中,并防止发生名称冲突,尤其是当您的代码库包含多个库时。

     

在面向对象的编程中,类是用于创建对象,提供状态(成员变量)和行为实现(成员函数或方法)的初始值的可扩展程序代码模板。

虽然听起来可能很相似,但它们是很具体的。因此,如果您的函数是相关的,但不一定与同一个对象相关,那么我会认真考虑是否将它们放在类中。特别是如果将这些功能归为一类可能违反“单一责任原则”:https://en.wikipedia.org/wiki/Single_responsibility_principle