gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:28 26 4
gpt4 key购买 nike

主题主要在此处解决 ( 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com