c++ - 定义一个类的私有(private)整型常量 : in the header or in the cpp file?

标签 c++

主题主要在此处解决 ( Where to declare/define class scope constants in C++? ) 特别是 here .

我想完全理解的是,在积分常数的情况下,它们之间有什么区别:

//In the header
class A {
private:
static const int member = 0; //Declaration and definition
};

和:

//In the header
class A {
private:
static const int member; //Only declaration
};

//In the cpp
const int A::member = 0; //Definition

(据我所知,第二种可能有一个优点,即如果我更改常量的值,我只需要重新编译一个文件)

附带问题:
例如,在访问 member 的 header 中定义的内联方法会发生什么情况?它会不会被内联?如果走向一种极端,所有方法都在头文件中定义为内联方法并且所有常量都在 cpp 文件中定义,会发生什么情况?

编辑:

我的道歉:我认为没有必要,但我错过了成员是静态的事实。我的问题仍然存在,但现在代码是合法的。

最佳答案

如果在将问题更改为静态之前,它是一个非静态成员,那么它只能在构造函数的初始化列表中或(自 2011 年起)在成员声明中初始化。您的第二个示例格式不正确。

如果它是静态的,那么如果它是odr-used,那么您需要一个定义:粗略地说,如果您做任何需要它的地址而不仅仅是它的值的事情。如果您只使用该值,那么第一个示例就可以了。但请注意注释是错误的——它只是声明,而不是定义。

如果您确实需要定义,则由您决定是在声明中还是在定义中指定值。在声明中指定它允许更好的优化范围,因为在使用变量时该值始终可用。在定义中指定它可以提供更好的封装,如果它发生变化,只需要重新编译一个翻译单元。

What happens for example with an inline method defined in the header that access member? Will it simply be not inlined?

访问另一个翻译单元中定义的数据对象没有理由阻止函数被内联。

关于c++ - 定义一个类的私有(private)整型常量 : in the header or in the cpp file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18141521/

相关文章:

c++ - OpenGL:帧缓冲区,不完整的纹理附件

c++ - 获取 LLVM 模块中的所有值

c++ - 如何将指针初始化为空

c++ - 尝试清除 QT C++ 中的文本编辑框(使用 QT Creator)

c++ - 有没有办法使用STL优雅地填充矩阵( vector 的 vector )?

c++ - 具有固定列宽的 QTreeView

c++ - 为什么标准库总是那么复杂?

c++ - 如何在 SFML 中实现基于网格的移动?

C++如何同时计算和写入

python - 使用 f2py 的 C++ 源时 undefined symbol