c++ - 类 const 属性初始化
问题描述
我有一个具有成员属性的类,我只在构造时设置一次,之后是只读的。该属性在该类的所有实例中并不相同。因此,我想将此属性定义为const T
.
我不能为构造函数体内的属性赋值,但只能在构造函数的初始化列表中初始化它的值。此外,初始化列表仅限于表达式。结果,在我将使用 switch 语句为该属性分配值的情况下,我不得不使用一长串三元运算。
我现在的情况是:
- 接受丑陋/冗长的初始化代码以保持属性定义与其预期语义一致,或者,
- 将成员属性定义为
T
(因此删除const
修饰符)并使用更简洁的 switch 语句在类构造函数的主体中初始化属性。
我应该选择哪个?什么是公认的或首选的规范?我倾向于 1,因为代码的语义对我来说非常重要。
谢谢!
解决方案
您可以通过将其划分为一个函数来使初始化更整洁。听起来逻辑可能太长而无法在 lambda 中整齐地编写,因此您可以只使用静态成员函数(或自由函数)来完成此任务。
Foo::Foo(Bar args)
: constMember(makeMyConstMember(args))
{}
如果做不到这一点,删除const
是一个烦人但可以接受的解决方法。const
很棒,但干净易读的代码更重要。
推荐阅读
- jquery - 为什么jQuery Datatable中有sDom,oLanguage这样的前缀?
- ios - ScrollView 中的动画缺少 SwiftUI 中的最后一个对象
- javascript - 当 textarea 替换为 input type = text 时,编写和解码编码消息的程序会出现故障
- apache-nifi - 我正在尝试将 pl/sql 命令发送到 oracleAQ
- java - 使用Java分组后如何在Spark Dataframe的每一行上应用函数
- java - Spring Data Cassandra 在数据库中两次插入后在 PT2S 后抛出 Query timed out
- excel - 即使 Exact 与特定引用一起使用,索引匹配和 Exact 的 Excel 结果也不起作用
- c# - ASP.NET MVC 4:尝试从输入文本框在 Sql Server 数据库中插入日期时间字段时收到错误
- c# - C# Jagged Array,确定是否有任何对匹配
- javascript - DOMException: play() 失败,因为用户没有先与文档交互(音频呼叫响铃)