如何正确排序/安排类成员
How to properly sort/arrange Class Members
我相信这个问题已经回答了几次了,我很快就会结束这个话题,但是我找不到它。
是否有推荐的方式来安排成员函数?
我很确定不是每件事都需要规则,但如果有关于这个话题的想法,这比按访问级别排序更重要。
伪代码中的示例类:
Class
amethod()
bmethod()
cvariable
avariable
bvariable
有一些建议,但它们相当模糊。唯一的共同点是,引用谷歌Java风格指南,§3.4.2,
表示每个类的成员在中按一定的逻辑顺序排序如果被问到,维护者可以解释。例如,新方法并不公正习惯性地加到课程末尾,因为这样会产生"时间顺序"按日期添加"排序",这不是一个逻辑排序。
Google c++风格指南建议按可见性排序(这对c++来说很明显),然后按类型排序:
类型和枚举
- 常量(静态常量数据成员)
<- 构造函数/gh>
- 析构函数
- 方法,包括静态方法
- 数据成员(静态常量数据成员除外)
Oracle的Java代码约定,§3.1.3,建议按类型排序,然后按可见性(对于变量)或功能(对于方法)排序:
- 类(静态)变量(按可见性排序)
- 实例变量(按可见性排序)
<- 构造函数/gh>
- 方法(按功能分组,而不是按范围或可访问性分组)
我不知道有什么普遍/广泛接受的惯例,除了"使用有意义的东西"(例如:对变量进行分组,而不是编写变量和函数的疯狂混合)。
然而,这不仅仅是一个风格问题:
在c++(和C)中,顺序直接映射到内存布局,这可能导致不同的变量大小,因为对齐和填充。此外,如果以二进制格式序列化某些东西,那么数据中的值当然很重要(但是以这种方式序列化并不完全好,,因为内存布局取决于…)。
并且,就像注释中提到的@huu一样,变量顺序决定了初始化顺序,这一点很重要,一个成员变量是用(同一对象的)另一个成员变量的值初始化的。变量声明顺序和初始化顺序不匹配会导致编译错误。
相关文章:
- 用于访问容器<T>数据成员的正确 API
- 这是关于成员访问规则的正确摘要吗
- C++正确的指针成员初始化
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 无法调用成员函数,尝试正确执行此操作仍然失败
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 非静态成员函数的 decltype 格式不正确吗?
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- 在类中声明 Array 成员的正确方法
- 如何在另一个类中使用类成员的正确方法?
- 初始化 const 成员的正确方法
- 在类中包含 zmq::socket_t 成员的正确方法?
- 从原始数据填充成员的正确方法是什么
- 将unique_ptr的向量传递给对象.向量成为成员变量.正确的方法
- 在C++(98、11和14)中初始化静态数据成员的正确方法是什么
- 这是访问类的数据成员的正确方式吗
- 依赖模板的基成员没有正确解析
- 这是初始化模板类的静态数据成员的正确方法吗
- 当存在另一个具有另一个签名的成员时,调用纯虚成员的正确方法是什么?
- 导出数据成员是否正确?(C++)