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

时间:2013-04-27 13:03:26

标签: c++

这两个声明之间有什么区别?

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

namespace foo
{
    void bar();
}

我看到它的方式没有,因为bar中的class foo无法访问thisbar中的foo也没有{{1}} }}

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

2 个答案:

答案 0 :(得分:7)

  

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

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

答案 1 :(得分:7)

在命名空间范围内定义的函数可以通过argument dependent lookup找到:

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

foo::bar x;
baz (x); // Ok, baz is found by ADL

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