Разница между классами и пространствами имен? - PullRequest
36 голосов
/ 06 июля 2010

Я смотрю на пространства имен и не вижу разницы между ними и классами. Я учу себя с ++ Я получил несколько книг в Интернете, поэтому я знаю, что я не изучаю наиболее эффективно. В любом случае, кто-то может сказать мне разницу между ними и тем, что будет лучшим временем для использования пространства имен в классе. Кроме того, я не вижу много о структурах в книге, которую я читаю.

Это формат?

struct go
{

  goNow(){ cout << "go Now"};

}

Заранее благодарим за помощь.

Ответы [ 6 ]

68 голосов
/ 06 июля 2010

Классы и структуры определяют типы.Вы можете создать объект типа.Пространства имен просто объявляют область, в которой могут существовать другие типы, функции, объекты или пространства имен.Вы не можете создать объект типа std (если, конечно, вы не создали тип с именем std, который скрывал бы пространство имен std).

Когда вы определяете функцию внутри структуры / класса (метод), вы говорите: «Эта функция является фундаментальной операцией над связанными данными».Когда вы определяете функцию внутри пространства имен, вы говорите: «Эта функция логически связана с другими функциями, типами и объектами в пространстве имен»

Редактировать

ЭтоВероятно, стоит отметить, что языки «все является объектом», такие как Java и C #, регулярно используют классы, как если бы они были пространствами имен, потому что они не допускают «свободных» функций.Это может быть то, откуда возникает путаница.Если у вас есть класс на другом языке, который не содержит ничего, кроме статических членов, вы захотите использовать пространство имен и свободные функции в версии C ++.

26 голосов
/ 06 июля 2010

Вы можете искать различия в Интернете, и я уверен, что вы найдете много;но имхо важно следующее: -

  • Вы можете заново открыть пространство имен и добавить вещи в единицах перевода.Вы не можете сделать это с классами.
  • Использование класса подразумевает, что вы можете создать экземпляр этого класса, что не соответствует действительности с пространствами имен.
  • Вы можете использовать декларации использования с пространствами имен, а с классами это невозможно, если вы не производныим.
  • Вы можете иметь безымянные пространства имен.

Пространство имен определяет новую область, и члены пространства имен, как говорят, имеют область пространства имен.Они обеспечивают способ избежать конфликтов имен (переменных, типов, классов или функций) без неудобств обработки вложенных классов.

11 голосов
/ 06 июля 2010

A class - это тип данных. Если у вас есть класс с именем Foo, вы можете создавать объекты класса Foo и использовать их различными способами.

A пространство имен - это просто абстрактный способ группировки элементов. Обычно в вашей программе не может быть двух функций с именем bar(). Если вы разместите их в отдельных пространствах имен, они могут сосуществовать (например, как A::bar() и B::bar()). Пространство имен не может быть создано как объект; думать об этом больше как об именовании.

Если вы пишете код, который хотите связать с объектом , который вы можете определить и использовать в качестве переменной, напишите class . Если вы пишете API или библиотеку и хотите обернуть все функции и константы, чтобы их имена не конфликтовали с тем, что мог написать пользователь, используйте пространство имен .

8 голосов
/ 06 июля 2010

Пространство имен - это способ группировки идентификаторов, чтобы они не конфликтовали.

Класс - это определение объекта, который может быть создан (как правило) и который включает функциональность и состояние.

Пространства имен и классы совершенно разные и служат разным целям. Они имеют некоторое синтаксическое сходство.

Структуры - это классы с другим спецификатором доступа по умолчанию (public для struct, private для class) - во всех остальных аспектах они одинаковы.

7 голосов
/ 06 июля 2010

Одно существенное отличие состоит в том, что пространства имен могут быть повторно открыты, но классы не могут быть:

namespace A {
    int f1();
}

namespace A {
    int f2();
}

допустимо, но:

class A {
    int f1();
};

class A {
    int f2();
};

не

0 голосов
/ 06 июля 2010

Из википедии

В общем, пространство имен - это абстрактный контейнер, предоставляющий контекст для элементов (имен, технических терминов или слов), которые он содержит, и позволяющий устранять неоднозначность для одноименных элементов с одинаковыми именами (находящихся в разных пространствах имен). Как правило, имена в пространстве имен не могут иметь более одного правописания, то есть его компоненты не могут иметь одно и то же имя . Пространство имен также называется контекстом, поскольку действительное значение имени может меняться в зависимости от того, какое пространство имен применяется. Имена в нем могут представлять объекты, а также понятия, будь то естественный или этнический язык, искусственный язык, техническая терминология профессии, диалект, социолект или искусственный язык (например, язык программирования).

С другой стороны A class defines a type.

Пространство имен может содержать несколько классов.

EDIT

Одно из различий будет таким:

У вас могут быть безымянные пространства имен, но у вас не может быть безымянного класса

    namespace{    //fine

           //some code....
    }

    class{   //illegal
    }
...