Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_C++11_Static_Constants - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,c++11,static,constants,C++,C++11,Static,Constants,我需要在cpp文件中使用一些常量值,它与类相关,不会在类之外使用 我想出了几种方法: 方法1:static const在.cpp文件中 我相信与C++11中的前一个方法相比,此方法是声明此类作用域常量的首选方法。 再说一次,如果我错了,请纠正我 方法3:static const在.h文件中 或者像这样:constinta{100}。我认为吊舱类型没有区别。 再一次,如果我错了,请纠正我 方法5:初始值设定项列表 类 { 公众: Class():a(100){}/对于普通的全局变量,const确实

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

我想出了几种方法:

方法1:
static const
.cpp
文件中 我相信与C++11中的前一个方法相比,此方法是声明此类作用域常量的首选方法。
再说一次,如果我错了,请纠正我

方法3:
static const
.h
文件中 或者像这样:
constinta{100}
。我认为吊舱类型没有区别。
再一次,如果我错了,请纠正我

方法5:初始值设定项列表
类
{
公众:

Class():a(100){}/对于普通的全局变量,
const
确实意味着
static
(但请注意,
const char*f;
不是const),因此#1有或没有
static
实际上是相同的。(这实际上是一个错误的特性,在变量具有这些特性之前的许多年,它被作为
constexpr inline
的一个模拟来包含。)#2也是相同的(只在也可以在匿名命名空间中声明,但不能声明为
静态

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

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


<p>4和5为每个类对象添加一个成员,最好避免考虑它们禁用默认<强>赋值< /强>运算符。

在4和5中,类的大小至少增加<代码> sieSof(int)。
。我认为#3最适合您的用例。但在我看来,让它成为静态constexpr会更好。使用最适合您当前情况的(#2)并在将来需要时进行更改。没有“理想的现在、永远和永远”除了真正琐碎的问题之外,任何问题的解决方案。是否允许子类更改此常量的值?#1和#2是相同的,不能被视为“类范围”-可以从同一文件中的任何位置访问它。
static const int a = 100; // <<<

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

int Class::bar() const
{
    return a - 10;
}
namespace
{
    const int a = 100;
}
class Class
{
public:
    int foo() const;
    int bar() const;
protected:
    static const int a = 100; // <<<
};
class Class
{
public:
    int foo() const;
    int bar() const;
protected:
    const int a = 100; // <<<
};
class Class
{
public:
    Class() : a(100) {} // <<<
    int foo() const;
    int bar() const;
protected:
    const int a;
};