“静态属性”和静态,const值之间有什么区别?

时间:2014-07-28 09:30:41

标签: c++ static const

我正在尝试为类创建静态的常量成员。现在,我有基于C#方式的这个功能:

class Question : public QObject
{
    Q_OBJECT
    friend class Answer;
public:
    static const QMap<QString /*name*/, QPair<QList<quint8> /*data*/, qint32 /*answerSize*/>> questionMap()
    {
        return {
            {
                "check digit",
                {
                    {
                        0xF0, 0xC0, 0x4F
                    },
                    3
                }
            },
            {
                "line detect",
                {
                    {
                        0xF0, 0xE0, 0x2F
                    },
                    79
                }
            }
        };
    }
    static const Question& createQuestion(const QString& questionName) {
        Question* question = new Question(questionName,
                                          Question::questionMap()[questionName].first,
                                          Question::questionMap()[questionName].second);
        return *question;
    }

我希望有更多这样的东西:

static const QMap<QString /*name*/, QPair<QList<quint8> /*data*/, qint32 /*answerSize*/>> questionMap =
    {
        {
            "check digit",
            {
                {
                    0xF0, 0xC0, 0x4F
                },
                3
            }
        },
        {
            "line detect",
            {
                {
                    0xF0, 0xE0, 0x2F
                },
                79
            }
        }
    };

因为我不确定第一种方法在内存管理方面看起来如何......这个函数只被调用一次,两个想法之间没有区别,或者第一个函数返回的对象是一遍又一遍地创建的并且使用第二种方法更有效率?无论如何,当我试图使用价值时,它会:

  

字段初始值设定项不是常量

     

非文字类型的静态数据成员的类内初始化

     

非常量的类内初始化对静态成员

无效      

(需要进行类外初始化)

     时,

无法通过非常量表达式初始化

当然,当我将初始化程序移出课堂时它会起作用但是......为什么呢?有没有办法解决它?我应该四处走走吗?有这个价值的最合适的方法是什么?

1 个答案:

答案 0 :(得分:1)

非文字类型的static const数据成员必须具有类外定义才能满足一个定义规则:Why can't I initialize non-const static member or static array in class?

当您访问非文字类型的static const数据成员时,该成员会绑定到const引用或隐式const this参数,因此它必须具有单个内存位置;这是通过具有类外定义来满足的,否则将没有单一定义来提供其存储位置。

拥有一个返回对象的static成员函数可能效率低下,因为每次调用static成员函数时都必须重新创建对象。