在 C++ 中,为啥语言不强制对类/结构的公共、私有和受保护成员进行分组?

Posted

技术标签:

【中文标题】在 C++ 中,为啥语言不强制对类/结构的公共、私有和受保护成员进行分组?【英文标题】:In C++ why is grouping not forced by the language on public, private and protected members of a class/struct?在 C++ 中,为什么语言不强制对类/结构的公共、私有和受保护成员进行分组? 【发布时间】:2010-09-23 12:30:10 【问题描述】:

是否只允许逻辑分组?

【问题讨论】:

【参考方案1】:

它为您提供灵活性。例如,您可能有一堆构造函数,一些是公共的,一些是受保护的,一些是私有的 - 您不希望它们全部组合在一起吗?

【讨论】:

【参考方案2】:

你为什么要强迫它?它根本不会帮助编译器,它不会客观地使人们更容易阅读。 C/C++ 哲学的一部分是该语言不会制定不能启用某种特性/功能的任意规则。

它确实使代码生成变得更加容易。许多编码风格在每个类中不止一次使用访问说明符——首先定义所有本地类型,然后定义所有构造函数,然后定义所有方法,然后定义所有实例变量,等等......

C++ 为您提供了足够的绳索,可以让您在脚下开枪,但同样的灵活性可以让您构建优雅、可维护且抽象良好的应用程序。

【讨论】:

【参考方案3】:

我认为你是对的。不强制允许用户按照他们认为合适的方式对事物进行分组,以提高代码的可读性。

编译器可能会在内存中以不同的方式组织事物。

编辑:按照规范:

§9.2 第 12 条(1998 和 2003 标准):在没有中间访问说明符的情况下声明的(非联合)类的非静态数据成员被分配,以便后面的成员在类中具有更高的地址目的。由访问说明符分隔的非静态数据成员的分配顺序未指定 (11.1)。实现对齐要求可能会导致两个相邻的成员不会被立即分配;管理虚拟功能 (10.3) 和虚拟基类 (10.1) 的空间要求也是如此。

我在a related SO question找到了这个信息

【讨论】:

我认为内存顺序实际上是固定的,以保持与 C 结构的向后兼容性。 是的,除非成员之间有访问说明符,这正是这里的情况。我已经包含了规范中的相关部分。 感谢您的澄清 - 我每天都学到新东西。 谢谢你提出这个问题,否则我自己永远也找不到正确的答案:)【参考方案4】:

我的猜测是它是 C 哲学的产物,它假设您知道自己在做什么,并为您提供最大的灵活性。这就像在 if 语句中允许单个 = 一样。

【讨论】:

仅供参考 - java 不禁止 if 语句中的赋值。 if (mb = b) ... 如果 mb 和 b 都是布尔类型,则为有效的 java。【参考方案5】:

我实际上以一种有点不愉快的方式利用了这一点:我经常使用的代码习惯是私有成员,具有公共访问器功能。

我有一个宏(不寒而栗),它会自动从一行中生成这些。

示例:

PROPERTY(int, MyVal);

...生成:...

private:
  int fMyVal;
public:
  void setMyVal(const int f)  fMyVal = f; ;
  int getMyVal()  return fMyVal; ;

只要您记得 PROPERTY 宏会切换当前的可见性,这就可以正常工作,这并不令人愉快....

例如:

protected:
  int v1;
  PROPERTY (int, v2) // fv2 is  private with public accessors
  int v3;  // whoops. f3 is public,

【讨论】:

小提示 - 如果一个宏改变了当前的可见性,我会把“private:”放在最后。这样,如果你犯了错误,你会得到编译器错误,而不是不小心让一个不应该公开的成员公开。【参考方案6】:

在“C++ 编程语言,第 3 版”中,Stroustrup 说这是为了使代码生成更容易。

虽然每个字段在实际二进制文件中的位置是基于在源代码中声明该字段的顺序是有意义的,但是这允许某人保持与 C 甚至其他语言的某种布局兼容性/规格。

【讨论】:

以上是关于在 C++ 中,为啥语言不强制对类/结构的公共、私有和受保护成员进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 c++ 类定义中的公共引用

经验总结

c和c++中,对结构体进行强制类型转换!

为啥我不需要私钥来解码我的亚马逊 JWT?

在 nx 库中,为啥通过公共 API 强制执行模块边界?

为啥在 C++ 中没有强制内联的标准方法?