是A类namspace

问题描述:

下面的代码将帮助我直接illustate我的问题给你:是A类namspace

#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“,虽然实际上bar只是foo类中的embebed类类型。我的问题 是一个类的范围本身是一个命名空间在c + +?

类不是一个命名空间,这是一个范围。你已经自己使用这个术语。命名空间是一个范围。类也是一个范围。 ::运营商是范围解析运营商。 范围,而不是名称空间,是在这种情况下可以作为“公分母”的基本术语。 范围是您可以在左侧使用::运算符以及类和名称空间的原因。

不,一个类不是一个名称空间。不过,一个类形成了一个声明区域。

您可以使用相同的语法(::运算符)引用在类范围声明的名称,就像引用在名称空间范围声明的名称一样。

+0

+1用于识别区别。 – 2010-09-26 02:53:06

类的范围与名称空间的范围不同。类可以模板化,这会影响其范围中的定义。类也可以具有只能在该范围内使用的定义(私有和受保护的)。

类名称本身不是名称空间,尽管范围操作符操作符将其视为或几乎同样如此。

类和名称空间之间的另一个有趣的区别是名称空间可以在多个文件和多个部分中声明,但类不能。例如,你可以这样做:

File a.hpp: 
    namespace Foo { 
     int memberA; 
    } 

File b.hpp: 
    namespace Foo { 
     int memberB; 
    } 
    ... 
    namespace Foo { 
     int memberC; 
    }