Является ли класс пространством - PullRequest
1 голос
/ 26 сентября 2010

следующий код поможет мне прояснить мой вопрос непосредственно к вам:

#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.мой вопрос: является ли область самого класса пространством имен в c ++?

Ответы [ 5 ]

9 голосов
/ 26 сентября 2010

Нет, класс не является пространством имен. Класс действительно формирует декларативную область, все же.

Вы используете тот же синтаксис (оператор ::) для ссылки на имена, объявленные в области видимости класса, что и для имен, объявленных в области пространства имен.

6 голосов
/ 26 сентября 2010

Класс не является пространством имен, это область действия .Вы уже использовали этот термин самостоятельно.Пространство имен - это область.Класс это тоже сфера.Оператор :: является оператором разрешения scope . Область действия , а не пространство имен , является фундаментальным термином, который может выступать в качестве «общего знаменателя» в этом случае. Область действия является причиной, по которой вы можете использовать оператор :: с классами и пространствами имен слева.

4 голосов
/ 26 сентября 2010

Другое интересное различие между классами и пространствами имен заключается в том, что пространство имен может быть объявлено в нескольких файлах и в нескольких частях, но класс не может.Например, вы можете сделать:

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

File b.hpp:
    namespace Foo {
        int memberB;
    }
    ...
    namespace Foo {
        int memberC;
    }
1 голос
/ 26 сентября 2010

Область действия класса не совпадает с областью пространства имен. Классы могут быть шаблонными, что влияет на определения в своей области. Классы также могут иметь определения, которые могут использоваться только в этой области (частные и защищенные).

0 голосов
/ 26 сентября 2010

Само имя класса не является пространством имен, хотя оператор области видимости обрабатывает его как таковой или почти как таковой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...