在Java
中,有一个名为package
的内容。 library
中的C++
是否代表相同的含义,特别是在涉及相关类和使用受保护成员方面?
感谢。
答案 0 :(得分:10)
package
在Java中的含义有不同的维度。作为一个容器,它将内部类的名称与其他包中的类的名称区分开来,它的等价物将是c ++ namespaces
。
作为一个保证访问同一块中的类的非私有成员的单元,C ++中没有相应的东西。授予类的访问级别独立于定义类的命名空间。
作为一种在磁盘中对源进行排序的方法,没有等价物,C ++语言对代码在文件中的存储方式没有要求。
关于c ++库,它更接近Java中的jar
文件。它们捆绑了不同的类,这些类共享某种关jar可以包含多个包,并且多个jar可以包含来自同一包的类。与库类似,它们可以包含来自不同命名空间的类和/或不同的库可以包含来自同一命名空间的类。
答案 1 :(得分:7)
与Java包最接近的是C ++中的namespaces。
它们可以相互嵌套,您需要明确声明自己是using
或其内容的一部分。但是,它们不会像Java包那样强制执行任何物理文件层次结构。
答案 2 :(得分:2)
严格来说,我认为C ++中的命名空间提供了相同的语义。
答案 3 :(得分:1)
我想它与C ++中的命名空间更相关。 Java和C ++都使用库。库可以是任何独立的类[可能是框架],可以在我们的代码中访问。
答案 4 :(得分:0)
Java和C ++都有外部库。只是格式不同,Java中的.jar和C ++中的.dll / .so。
包和命名空间的目的与库不同。它们允许用户对源进行逻辑分组,从而避免耗尽名称。
答案 5 :(得分:0)
Java中的package
是类,接口和枚举的命名空间。包名称,点和类名构成类的完全限定类名:
com.example.hello.HelloWorldApplication
^--packagename--^ ^-----classname-----^
包名中的点与名称之间的点有不同的含义:此示例的前两个点是包名称的一部分,最后一个是分隔符。
这应该牢记在心,因为对包名有一个共同的误解:只是因为名称可以映射到分层文件夹结构,有些人认为,包名也有层次结构 - 事实并非如此:{ {1}}不是hello
的“子包”!
但是,要创建一个简单的映射到文件夹和文件,类加载器可以简单地使用完全限定的类名称,用斜杠替换所有点并附加example
以获取相对类文件的路径。
但请再次注意,不需要文件夹/文件映射加载类 - 我们可以发明一个从数据库或远程服务获取类的类加载器 - 文件夹/文件映射在那里没有任何意义情况下。