2010-07-06 8 views
26

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

Это формат?

struct go 
{ 

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

} 

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

+0

Это [беседа] (http://stackoverflow.com/questions/713698/c-namespaces-advice?lq=1) может помочь вам оценить роль пространств имен. – jxramos

+0

Интересно, что я не видел, чтобы кто-нибудь упоминал, что доступ к членам класса и функциям может контролироваться классом или структурой через общедоступные, защищенные, приватные и т. Д. – user8381651

ответ

57

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

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

Edit

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

+16

+1. Что касается структур: 'class' и' struct', по сути, одно и то же - их часто называют так называемыми пользовательскими типами. Единственное различие заключается в том, что 'class' делает закрытыми члены и базовые классы по умолчанию, а' struct' делает их общедоступными. –

+3

Я нашел сообщение Скотта Мейерса на [Как функции, не связанные с членством, улучшают инкапсуляцию] (http://www.drdobbs.com/cpp/how-non-member-functions-improve-encapsu/184401197), чтобы быть весьма полезными при изучении когда использовать имена. – PythonJin

0

Из википедии

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

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

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

EDIT

Одно различие было бы это:

Вы можете иметь неназванные пространств имен, но вы не можете иметь неназванной класс

namespace{ //fine 

      //some code.... 
    } 

    class{ //illegal 
    } 
+4

Я действительно не вижу, как цитируемый текст относится к C++. – 2010-07-06 16:39:43

+2

В пространствах имен есть другая (какая-то конкретная) роль в C++? Что не так с цитируемым текстом. –

7

Пространство имен представляет собой способ группировки идентификаторов чтобы они не столкнулись.

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

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

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

22

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

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

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

10

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

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

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

5

Одним из основных отличий является то, что пространство имен может быть вновь открыт, но классы не могут быть:

namespace A { 
    int f1(); 
} 

namespace A { 
    int f2(); 
} 

является законным, но:

class A { 
    int f1(); 
}; 

class A { 
    int f2(); 
}; 

не

Смежные вопросы