gpt4 book ai didi

c++ - 在 C++ 中定义类作用域常量的最佳方法

转载 作者:行者123 更新时间:2023-12-02 10:22:17 29 4
gpt4 key购买 nike

我需要在 cpp 中使用一些常量值与类相关且不会在类之外使用的文件。

我想出了几种方法来做到这一点:

方法一:static const.cpp文件

static const int a = 100; // <<<

int Class::foo() const
{
return a + 10;
}

int Class::bar() const
{
return a - 10;
}

如果我做对了,我也可以省略 static关键字为 const在此上下文中自动暗示内部链接。
如果我错了,请纠正我。

方法 2:匿名命名空间 (C++11)

与之前的基本相同,但是:
namespace
{
const int a = 100;
}

我相信这种方法是在 C++11 中声明此类作用域常量的首选方法。
再次,如果我错了,请纠正我。

方法三: static const.h文件
class Class
{
public:
int foo() const;
int bar() const;
protected:
static const int a = 100; // <<<
};

方法四:非静态 const.h (C++11)
class Class
{
public:
int foo() const;
int bar() const;
protected:
const int a = 100; // <<<
};

或者像这样: const int a{100} .我认为 POD 类型没有区别。
再一次,如果我错了,请纠正我。

方法五:初始化列表
class Class
{
public:
Class() : a(100) {} // <<<
int foo() const;
int bar() const;
protected:
const int a;
};

加起来

我想我不能使用方法 1 和 2,因为如果我需要创建子类,它们会失败。

另外,我认为如果有很多重载的构造函数,方法5将很难维护。

虽然这个问题可能被认为是基于意见的,但我主要是想弄清楚这些方法的利弊,可能还有其他一些可能的解决方案。

最佳答案

对于普通全局变量,const确实暗示 static (但请注意 const char *f; 不是常量),所以 #1 有或没有 static确实是一样的。 (这确实是一个错误功能,作为 constexpr inline 的模拟包含在变量可以拥有这些之前很多年。)#2 也是相同的(仅首选 也可以在匿名命名空间中声明但不能声明 static )。

这些对于派生类来说本质上并不是坏事:它们将常量限制在源文件中,源文件可以为您喜欢的数量或数量定义方法。您也可以将它们放入 .hpp文件,尽管更喜欢类成员是合理的。

对于 #3,请注意变量不必是 初始化 在类定义中。这样做可以让它在包含标题的每个文件中的常量表达式中使用,在这种情况下,现代风格(支持非整数变量)将使用 constexpr .

#4 和 #5 向每个类对象添加一个成员,最好避免 - 考虑他们禁用默认 作业 运营商。

关于c++ - 在 C++ 中定义类作用域常量的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59588992/

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