c++ - 什么时候非静态 const 数据成员比 const 静态数据成员更有用?

标签 c++ static constants

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

最佳答案

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

以下将导致编译错误,因为变量是常量:

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

关于c++ - 什么时候非静态 const 数据成员比 const 静态数据成员更有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23041169/

相关文章:

c++ - Qt : How to get all the classes that are children of a specific class

c++ - 32位和64位系统之间的通信

c# - 绑定(bind)并更新静态属性

php - 如何解决创建多个静态页面的问题

c++ - 该对象具有与覆盖 draw 的成员函数 sfml 不兼容的类型限定符

Java Webstart 报告错误的 Bootloader 选项

c++ - 这个 if/else/else if 语句有什么问题?

c++ - WNDPROC 窗口回调过程中收到的句柄与 CreateWindow 返回的句柄之间的区别?

c++ - 函数范围内的静态声明和定义不会改变?

c# - 在 VB.NET 中声明一个十六进制常量