公共静态类成员函数和在命名空间中声明的全局函数有什么区别?
What's the difference between a public static class member function and a global function declared in a namespace?
这两个声明有什么区别?
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是一个类,而不是一个命名空间,这不起作用
相关文章:
- 内联函数中具有内部链接的全局变量
- 为什么虚函数不能是静态的和全局的?
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局作用域中函数指针的赋值
- 在命名空间中使用全局命名空间中的函数
- C++ 在编译时具有函数计算全局变量
- 在具有全局类型def的类中使用成员函数指针
- 修改程序的入口点时未调用全局变量的构造函数
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 全局函数参数
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 初始化与函数输入相关的全局数组
- 删除全局隐式函数 - 避免使用不明确的运算符
- 如何在全局变量的构造函数之前运行函数
- 如何定义全局函数指针并分配给特定地址
- 越界成员函数定义是否需要一个完全限定的类名,直到全局范围
- 在函数中用不同的名称引用全局向量
- 如何在一个结构体中为多个函数全局存储数据