This question already has answers here:
Namespace + functions versus static methods on a class
(7个答案)
去年关闭。
我在头文件中有一堆函数(func1(),func2(),...),我想提供一些作用域。我知道2种实现:
在这两个选项中,我都可以以相同的方式访问函数,即通过
哪个选项更好?还有其他选择吗? 限定功能名称的必要性。
对于类,您必须在以下情况下写
一个带有using声明的函数
并在大多数范围内使用不合格的产品。如果您希望,甚至可以使用using指令使 namespace 的所有成员可用于非限定名称查找。类没有等效的机制。 别名。
没有区别。给类写一个别名
而别名空间是用
隐私。
一个类(class)可以有私有(private)成员。因此,您可以将函数声明放在私有(private)访问说明符下,并在公共(public)内联成员中使用它们。命名空间没有这种机制。取而代之的是,我们依靠约定并将声明放在“请勿触摸此”内部命名空间下,该命名空间通常称为 Argument dependent lookup。
C++具有一种机制,可以通过检查包含调用参数的 namespace 来从不合格的调用中查找函数声明。为此,该函数必须在实际的 namespace 中。类的静态成员无需进行此类查找。因此,对于您可能拥有的任何成员类型,只有 namespace 将允许通过ADL进行调用。
这四个人不在我的脑海中。判断自己的需求。至于“还有其他选择吗?”,这是当今您必须在C++中对此类函数进行分组的仅有的两种方法。在C++ 20中,我们将有模块!这将为代码提供另一个层次的分组。
(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
。 C++具有一种机制,可以通过检查包含调用参数的 namespace 来从不合格的调用中查找函数声明。为此,该函数必须在实际的 namespace 中。类的静态成员无需进行此类查找。因此,对于您可能拥有的任何成员类型,只有 namespace 将允许通过ADL进行调用。
这四个人不在我的脑海中。判断自己的需求。至于“还有其他选择吗?”,这是当今您必须在C++中对此类函数进行分组的仅有的两种方法。在C++ 20中,我们将有模块!这将为代码提供另一个层次的分组。
关于c++ - 命名空间内的作用域与类内的作用域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56162462/