仅允许逻辑分组吗?
6 回答
它为您提供灵活性。例如,您可能有一堆构造函数,一些是公共的,一些是受保护的,一些是私有的——您不希望它们全部组合在一起吗?
你为什么要强迫它?它根本不会帮助编译器,它不会客观地使人们更容易阅读。C/C++ 哲学的一部分是该语言不会制定不启用某种特性/功能的任意规则。
它确实使代码生成变得更加容易。许多编码风格对每个类多次使用访问说明符——首先定义所有局部类型,然后定义所有构造函数,然后定义所有方法,然后定义所有实例变量,等等......
C++ 为您提供了足够的绳索,足以让您自食其果,但同样的灵活性可以让您构建优雅、可维护且抽象良好的应用程序。
我认为你是对的。不强制使用它可以让用户按照他们认为合适的方式对事物进行分组,以获得更好的代码可读性。
编译器可能会在内存中以不同的方式组织事物。
编辑:根据规范:
§9.2 第 12 条(1998 年和 2003 年标准):
在没有中间访问说明符的情况下声明的(非联合)类的非静态数据成员被分配,以便后面的成员在类对象中具有更高的地址。由访问说明符分隔的非静态数据成员的分配顺序未指定 (11.1)。实现对齐要求可能会导致两个相邻的成员不会被立即分配;管理虚拟功能 (10.3) 和虚拟基类 (10.1) 的空间要求也是如此。
我实际上以一种有点不愉快的方式利用了这一点:我经常使用的代码习惯是私有成员,具有公共访问器功能。
我有一个宏(不寒而栗),它会从一行自动生成这些。
例子:
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,
我的猜测是它是 C 哲学的产物,它假设您知道自己在做什么,并为您提供最大的灵活性。这就像在 if 语句中允许单个 = 一样。
在“The C++ Programming Language, 3rd edition”中,Stroustrup 说这是为了使代码生成更容易。
尽管实际二进制文件中每个字段的位置是基于在源代码中声明该字段的顺序是有意义的,但是这允许某人保持与 C 甚至其他语言/规范的某种布局兼容性。