【问题标题】:C++ Access Specifiers: public to namespace only? [duplicate]C++ 访问说明符:仅对命名空间公开? [复制]
【发布时间】:2021-04-23 07:49:50
【问题描述】:

在许多其他语言中,类/结构和成员的默认访问级别是在命名空间范围内,public 表示它可以在该命名空间(或包,或库,或他们称之为的任何东西)之外访问命名空间。)

在 C++ 中,我看到我有选项 public 使其随处可见,private 仅用于类,protected 用于此类和嵌套类。

只有这个命名空间呢?如果您正在编写一个可以访问其自己的类及其成员的库,同时通过导入文件来限制访问,这通常很有用。

【问题讨论】:

  • 记住 C++ 有 namespace,但您使用的术语“命名空间”似乎还有其他含义?
  • namespace 可以扩展(与类相反),所以friend namespace 确实开放访问。

标签: c++


【解决方案1】:

您的最后一句话实际上是 C++ namespace 所做的。

定义一个类属性/方法,无论public 使它可以在类/类实例之外访问。但不在它定义的namespace 之外。 要使某些内容在当前的namespace 之外可访问,您必须使用某种限定名称或using 指令。例如,请参阅here

可能会出现混淆,因为默认情况下,例如在你的类周围没有明确的namespace 定义范围是在全局namespace 中定义的,因此它的公共属性/方法等可以在全局命名空间的任何地方访问。

【讨论】:

  • 但是导入文件仍然可以使用namespace::xyz访问类xyz,所以它不是私有的。我的意思是让除了当前命名空间之外的所有名称都无法访问它,就像 private 关键字在类范围内所做的那样。
  • @Alasdair 在一个未命名的命名空间内声明预期私有的类/结构/变量,即没有名称的,它只对当前翻译单元可见,即,当前的.cpp 文件。
  • @Casey,这是一个好主意,但可以用类中的某些成员而不是其他成员来完成吗?
  • 好的,如果你想这样做,我不确定命名空间是否是正确的工具。您是否考虑过将功能封装在纯虚拟类中?许多人使用它们在 C++ 中定义接口
  • @Alasdair 你混淆了classnamespace,它们在C++ 中是两个不同的东西。 classes 定义了一个类型。 namespaces 防止代码中的名称冲突(并且具有将逻辑上相关的代码分组的副作用,例如数学-y 类型位于 Math 命名空间中。)
猜你喜欢
  • 2013-08-30
  • 2011-01-05
  • 2015-12-16
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 2017-08-26
相关资源
最近更新 更多