命名空间内与类内的范围函数[重复]

Posted

技术标签:

【中文标题】命名空间内与类内的范围函数[重复]【英文标题】:Scoping functions within namespace versus within class [duplicate] 【发布时间】:2019-10-03 08:56:04 【问题描述】:

我在一个头文件中有一堆函数(func1(),func2(),...),我想给它一些范围。我知道 2 个实现:

    class bunchOfFunctions
    
    public:
    static void func1();
    static void func2();
    ...
    ;
    
    namespace bunchOfFunctions
    
    void func1();
    void func2();
    ...
    ;
    

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

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

【问题讨论】:

在 OO 编程中,您将数据和方法组合到对象中,因此如果两者兼而有之,那么类最有意义。如果你的类只包含静态函数,你可以考虑命名空间,尽管它们通常被认为是比类更大的单元。 【参考方案1】:

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

    必须限定函数名称。 在上课时,您必须bunchOfFunctions::func1() 利用这些功能。同时命名空间允许你拉 带有 using 声明的函数
    using bunchOfFunctions::func1;
    
    并在大多数范围内不合格地使用它。如果您愿意,您甚至可以使用 using 指令使命名空间的所有成员都可用于非限定名称查找。职业没有等效的机制。 别名。 没有区别。别名类一写
    using BOF = bunchOfFunctions;
    
    虽然命名空间的别名是通过
    namespace BOF = bunchOfFunctions;
    
    隐私。 一个类可以有私有成员。因此,您可以将函数声明放在私有访问说明符下,并在公共内联成员中使用它们。命名空间没有这样的机制。相反,我们依赖约定并将声明放在“请勿触碰”内部命名空间下,通常称为bunchOfFunctions::detail。 Argument dependent lookup. C++ 有一种机制,允许它通过检查包含调用的参数 的名称空间,从非限定调用中找到函数声明。为此,该函数必须位于实际的命名空间中。类的静态成员不受这种查找的影响。因此,对于您可能拥有的任何成员 types,只有命名空间允许通过 ADL 进行调用。

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

【讨论】:

【参考方案2】:

除了 StroryTeller 的高亮点,

传播:namespace 可以传播到多个文件中,而 Class 必须在一个地方定义。

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

以上是关于命名空间内与类内的范围函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

命名空间范围内的静态关键字无用?

获取命名空间内的所有类[重复]

实际场景中的代表:在命名空间范围内的类范围内

10函数进阶---命名空间

使用内核命名空间 PID 从全局范围中杀死进程

命名空间