【问题标题】:When is a non-static const data member more useful than a const static one?什么时候非静态 const 数据成员比 const 静态数据成员更有用?
【发布时间】:2014-04-13 09:41:19
【问题描述】:

在 C++ 中,有静态和非静态 const 数据成员。 当我想要一个常量时,我​​总是将其设为static,因为如果无法修改该项目,则拥有多个副本(每个类的每个实例一个)是没有意义的。我想知道为什么会有非静态const 成员?

【问题讨论】:

  • 使用static 将此变量放入数据部分。如果您只使用本地对象,并且您的堆栈足够大以容纳它们,即使它们稍大(由于额外的非静态成员变量),您可能希望避免这种情况。
  • @barakmanos 这是否与特定硬件有关,或者即使代码可以在 PC 上运行也有明显优势?
  • 它依赖于编译器实现(即,未由 C++ 语言标准定义)。我不明白您所说的“即使代码可以在 PC 上运行”是什么意思。

标签: c++ static constants


【解决方案1】:
class MyClass
{
    public:
       MyClass(int val): myVal(val) {}
       const int myVal;
};

在这个小例子中,myVal 在没有 getter 方法的情况下可供所有人读取,但在 MyClass 实例化后就无法修改。

您只需将数据类型声明为const,以确保它们以后不会被修改。

因为myVal 不是static,所以MyClass 的每个不同实例都可以有不同的值。如果myValstatic,那么每个实例的值都相同,并且构造函数不能赋值。

举个例子

#include <iostream>
using namespace std;

class MyClass
{
    public:
        MyClass(int val) : myConst(val) {}
        void printVars() {
            cout << "myStatic " << myStatic << endl;
            cout << "myConst " << myConst << endl;
        }

        static const int myStatic;
        const int myConst;
};

const int MyClass::myStatic = 5; //Note how this works without 
                                 //an instance of MyClass

int main()
{
    MyClass ca(23);
    MyClass cb(42);
    cout << "ca: " << endl;
    ca.printVars();
    cout << "cb: " << endl;
    cb.printVars();
    return 0;
}

结果:

ca: 
myStatic 5
myConst 23
cb: 
myStatic 5
myConst 42

以下会导致编译错误,因为变量是 const:

ca.myConst = 11;
ca.myStatic = 13;

【讨论】:

  • 但是比static const int myVal有什么优势呢?
  • @barakmanos 每个实例都可以有自己的不同常量值myVal。它在构造函数的初始化列表被执行时设置一次,之后的语义是它不能被改变。但是每个实例都可以有自己的价值。
  • @Marius:知道了。很酷的答案(假设它正在编译没有错误)。
【解决方案2】:
  1. static const 适用于类
  2. const 应用于对象

例如

class Verticies {
    public:
       const int colour;
       static const int MAX_VERTICIES = 100;
       Point points[MAX_VERTICIES];
       Verticies(int c) : colour(c) { }
       // Etc
};

这里MAX_VERTICIES 适用于Verticies 类型的所有对象。但是不同的物体可能有不同的颜色,而且颜色是固定在构造上的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多