公共静态类成员函数和在命名空间中声明的全局函数有什么区别?

What's the difference between a public static class member function and a global function declared in a namespace?

本文关键字:函数 全局 什么 区别 声明 命名空间 静态类 成员      更新时间:2023-10-16

这两个声明有什么区别?

class foo
{
public:
    static void bar();
};

namespace foo
{
    void bar();
}

在我看来,没有,因为class foo中的bar不能访问this, bar在命名空间foo中也不能访问。

公共静态类成员函数和在命名空间中声明的全局函数有什么区别?
  • 类成员函数将能够访问类的私有静态成员,而命名空间中的函数将不直接具有任何类型的数据保护
  • 正如@ValarDohaeris所指出的,即使在对象上下文中,您也可以创建类foo的对象并调用obj.bar(),而名称空间无法实现相同的功能,因为没有名称空间的实例
  • 命名空间可以导入通过using使bar()成为有效调用
  • 正如@John5342所提到的,您可以在模板参数中使用foo类。例如在template<typename T> fun() { T::bar(); }

在命名空间范围内定义的函数可以通过参数依赖查找找到:

namespace foo
{
    class bar;
    void baz (bar);
}
foo::bar x;
baz (x); // Ok, baz is found by ADL

如果foo是一个类,而不是一个命名空间,这不起作用