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

Dan*_*zar 1 c++

这两个声明有什么区别?

class foo
{
public:
    static void bar();
};
Run Code Online (Sandbox Code Playgroud)

namespace foo
{
    void bar();
}
Run Code Online (Sandbox Code Playgroud)

我看到它的方式,没有,因为barin class foo无法访问this,也没有bar命名空间foo.

当然,这纯粹是理论上的.

Sho*_*hoe 7

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

  • 类成员函数将能够访问类的私有静态成员,而命名空间内的函数不会直接具有任何类型的数据保护
  • 正如@ValarDohaeris所指出的,你可以创建一个类的对象,甚至可以在一个对象上下文中foo调用obj.bar(),而使用名称空间则无法实现,因为没有名称空间的实例
  • 可以通过进行有效调用来导入名称空间usingbar()
  • 正如@ John5342所提到的,您可以foo在模板参数中使用该类.例如在template<typename T> fun() { T::bar(); }


Ale*_* C. 7

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

namespace foo
{
    class bar;
    void baz (bar);
}

foo::bar x;
baz (x); // Ok, baz is found by ADL
Run Code Online (Sandbox Code Playgroud)

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

  • +1。不是唯一的区别,但肯定是这个问题的作者接受的答案中没有提到的重要区别。 (2认同)