标题中两者之间有语义差异吗?
例如,我可以写,
class Hi{
public:
static void Print(){
printf("hi\n");
}
};
而且
namespace Hi{
inline void Print(){
printf("hi\n");
}
}
我当然假设这两个定义都在标题中。这只是风格问题吗?
最佳答案
主要区别在于命名空间可以扩展,而类可以继承。这种差异对于 C++03 中的“枚举包装器”很重要。有些人强烈赞成将枚举包装在类中,而另一些人则强烈赞成将它们包装在命名空间中,而也许大多数人并不关心并且没有包装。
命名空间支持参数相关查找,而类则不支持(除了类定义中定义的友元函数的调用,然后它实际上是命名空间 ADL 启动)。
类支持访问控制(公共(public)、 protected 、私有(private)),而命名空间则不支持。对于命名空间,与私有(private)访问相对应的技术是一个名为 detail
或 impl
或类似名称的嵌套命名空间。但这只是约定,编译器无法检查和强制执行。
我想,由于以上是我首先想到的,因此它可能是最相关的。
值得注意的是:使用类作为一种人造命名空间机制的库确实存在(特别是我遇到了这种类型的 XML 解析器库),但它们非常罕见,我对此表示怀疑除了上述可能的枚举包装之外,任何新库都会执行此操作,但 C++11 的作用域枚举使枚举包装变得不那么重要。
关于c++ - 命名空间作用域中的内联函数和类作用域中的静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30414305/