c++ - 命名空间作用域中的内联函数和类作用域中的静态函数

标签 c++

标题中两者之间有语义差异吗?

例如,我可以写,

class Hi{
public:
  static void Print(){
    printf("hi\n");
  }
};

而且

namespace Hi{
  inline void Print(){
    printf("hi\n");
  }
}

我当然假设这两个定义都在标题中。这只是风格问题吗?

最佳答案

主要区别在于命名空间可以扩展,而类可以继承。这种差异对于 C++03 中的“枚举包装器”很重要。有些人强烈赞成将枚举包装在类中,而另一些人则强烈赞成将它们包装在命名空间中,而也许大多数人并不关心并且没有包装。

命名空间支持参数相关查找,而类则不支持(除了类定义中定义的友元函数的调用,然后它实际上是命名空间 ADL 启动)。

类支持访问控制(公共(public)、 protected 、私有(private)),而命名空间则不支持。对于命名空间,与私有(private)访问相对应的技术是一个名为 detailimpl 或类似名称的嵌套命名空间。但这只是约定,编译器无法检查和强制执行。

我想,由于以上是我首先想到的,因此它可能是最相关的。

值得注意的是:使用类作为一种人造命名空间机制的库确实存在(特别是我遇到了这种类型的 XML 解析器库),但它们非常罕见,我对此表示怀疑除了上述可能的枚举包装之外,任何新库都会执行此操作,但 C++11 的作用域枚举使枚举包装变得不那么重要。

关于c++ - 命名空间作用域中的内联函数和类作用域中的静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30414305/

相关文章:

c++ - 带有嵌套 vector 的 map

c++ - std::equal_range 的可能实现

c++ - pthread 在一定时间后终止

c++ - 具有可变参数模板的模糊部分模板特化

c++ - 如何在 C++ Windows 游戏中播放声音?

c++ - 基类不应该有成员复制?

c++ - 在 C++ 中定义常量 C 字符串的正确方法?

c++ - c# 在 C++ 中重写的方法

c++ - Gtk::Layout 中的 gtkmm 居中小部件

c# - 在 C# 中实现与 CTime.GetTime() 方法相同的行为