- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
假设我有一个需要一些常量才能运行的类。几个成员函数需要使用这些常量。不赞成使用#define,因为它会导致冲突。常量是 8 位或 16 位的十六进制模式,存储为 uint8_t 或 uint16_t。这些常量也不会因类的实例而异,因此只需保存一份常量拷贝即可节省内存(尽管内存很少)。
有什么不合适的,或者可能是更好的方法来完成上述操作,而不是简单地执行以下操作:
// mycode.h
// .......
class myclass {
private:
static const uint16_t kMyClassConstant_ = 0xBEEF;
// .......
};
提前感谢您的帮助。
最佳答案
鉴于您对情况的描述,我会说使用 static const
成员是一种好方法。在 C++11 中,您可能希望将其更改为 static constexpr
以强调它是编译时常量,尽管不会因此而有效地改变。
如果您在代码中的某处引用 myclass::kMyClassContant_
,其方式与单一定义规则 (odr) 相关,尤其是。在需要引用(包括 const-reference)的上下文中,编译器会提示没有定义常量。在这种情况下,仅仅在类中声明和初始化它是不够的。这可能会迫使您将声明和定义分开:
// mycode.h
class myclass {
private:
static const uint16_t kMyClassConstant_;
};
// mycode.cpp
const uint16_t myclass::kMyClassConstant_ = 0xBEEF;
为了避免维护单独的声明和定义的麻烦,有些人更喜欢声明一个内联的 constexpr 函数而不是一个实际的变量:
// mycode.h
class myclass {
private:
static constexpr uint16_t kMyClassConstant_()
{ return 0xBEEF; }
};
对于许多与 odr 相关的问题,这是一种正确的解决方法,并且不会导致任何性能损失。它是否真的有用取决于维护普通静态常量的单独声明和定义的负担有多大。如果您希望常量永远不会随着代码的发展而改变,那么最好使用具有单独定义的普通静态常量。但是,如果您经常修改常量的定义,则必须重新编译定义文件并将其重新链接到项目的所有相关部分可能会使您认为上述基于函数的解决方案是更好的选择。
对数据类型的最后评论:如果您需要以紧凑的形式存储大量这些值,则使用 std::uint16_t
将其强制为 16 位可能很有用。否则,实际大小可能并不重要,在这种情况下 std::uint_fast16_t
(可能大于 16 位)可能会更好。
关于C++ 静态常量成员变量用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17056882/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!