以下代码将帮助我直接向您提出问题:
#include<iostream>
class foo {
public:
class bar {
public:
bar(int a) : m_a(a) {}
void say() { std::cout << m_a << std::endl;}
private:
int m_a;
};
};
int main()
{
foo::bar b(3);
b.say();
}
如你所见,为了声明类bar的对象,我们使用类似语法“foo :: bar”的完全命名空间,尽管实际上bar只是类foo中的一个embebed类类型。我的问题 类本身的范围是否是c ++中的命名空间?
答案 0 :(得分:9)
不,类不是命名空间。但是,类确实形成了一个声明区域。
使用相同的语法(::
运算符)来引用在类范围内声明的名称,就像引用在命名空间范围内声明的名称一样。
答案 1 :(得分:6)
该类不是命名空间,而是范围。你自己已经使用过这个术语了。命名空间是一个范围。类也是范围。 ::
运算符是范围解析运算符。 范围,而不是命名空间,是在这种情况下可以充当“共同点”的基本术语。 范围是您可以在左侧使用::
运算符同时使用类和命名空间的原因。
答案 2 :(得分:4)
类和命名空间之间的另一个有趣区别是命名空间可以在多个文件和多个部分中声明,但类不能。例如,你可以这样做:
File a.hpp:
namespace Foo {
int memberA;
}
File b.hpp:
namespace Foo {
int memberB;
}
...
namespace Foo {
int memberC;
}
答案 3 :(得分:1)
类的范围与命名空间的范围不同。类可以是模板化的,这会影响其范围内的定义。类也可以具有只能在该范围内使用的定义(私有和受保护)。
答案 4 :(得分:0)
类名本身不是名称空间,尽管作用域操作符将其视为这样,或者几乎同样如此。