В Java
есть то, что называется package
. Означает ли library
в C++
то же значение, особенно в терминах, например, в терминах содержания относительных классов и использования защищенных членов?
Спасибо.
В Java
есть то, что называется package
. Означает ли library
в C++
то же значение, особенно в терминах, например, в терминах содержания относительных классов и использования защищенных членов?
Спасибо.
Есть разные измерения того, что означает package
в Java. В качестве контейнера, который отличает имена классов внутри от имен классов в других пакетах, его эквивалентом будет c ++ namespaces
.
Как модуль, который гарантирует доступ к классам в том же блоке не являющимся частными членами, в C ++ нет эквивалента. Уровень доступа, предоставляемый классу, не зависит от пространства имен, в котором класс определен.
В качестве способа упорядочивания ваших источников на диске нет эквивалента, язык C ++ не имеет требований к тому, как код хранится в файлах.
Что касается библиотек C ++, это ближе к jar
файлам в Java. Они объединяют разные классы, которые имеют некоторое отношение. Jar может содержать более одного пакета, и более одного jar могут содержать классы из одного и того же пакета. Точно так же с библиотеками они могут содержать классы из разных пространств имен и / или разные библиотеки могут содержать классы из одного и того же пространства имен.
Наиболее близкими к пакетам Java являются пространства имен в C ++.
Они могут быть вложены друг в друга, и вам нужно специально заявить, что вы using
они или часть их содержимого. Однако они не навязывают никакой физической иерархии файлов, как это делают пакеты Java.
Строго говоря, я думаю, что пространства имен в C ++ обеспечивают ту же семантику.
Думаю, это больше связано с пространствами имен в C ++. И Java, и C ++ используют библиотеки. Библиотека может быть любым независимым набором классов [возможно, фреймворком], к которому можно получить доступ в нашем коде.
Внешние библиотеки есть как в Java, так и в C ++. Различаются только форматы: .jar в Java и .dll / .so в C ++.
Назначение пакетов и пространств имен отличается от библиотек. Они избегают исчерпания имен, позволяя пользователю логически сгруппировать источник.
package
в Java - это пространство имен для классов, интерфейсов и перечислений. Имя пакета, точка и имя класса образуют полное имя класса класса:
com.example.hello.HelloWorldApplication
^--packagename--^ ^-----classname-----^
Точки в имени пакета имеют другое значение, чем точка между именами: первые две точки в этом примере являются частью имени пакета, последняя является разделителем.
Это следует иметь в виду, потому что существует распространенное заблуждение относительно имен пакетов: некоторые люди думают, что имена пакетов могут быть сопоставлены с иерархической структурой папок, а имена пакетов тоже имеют иерархию - что не так: hello
не является "подпакет" из example
!
Но для создания простого сопоставления с папками и файлами загрузчик классов может просто взять полное имя класса, заменить все точки косой чертой и добавить .class
, чтобы получить относительный путь к файлу класса.
Но обратите внимание, что сопоставление папок / файлов не требуется для загрузки классов - мы можем изобрести загрузчик классов, который получает классы из базы данных или удаленной службы - сопоставление папок / файлов в этом случае не имело бы никакого смысла.