首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++静态const类成员初始化

问C++静态const类成员初始化
EN

Stack Overflow用户
提问于 2014-05-20 18:23:52
回答 3查看 1.5K关注 0票数 1

我想要一个具有静态成员的类,但是我不知道如何做到这一点。这可能吗?

我知道错误:

只能在类内初始化静态const积分数据成员。

代码:

代码语言:javascript
复制
namespace misc
{
    class CData
    {
    public:
        CData( ) { };
        CData( int d );

        CData& operator = ( const CData& d );

        static const CData FIRST = CData( 512 ); //how?

    private:
        int data;
    };
}

由于我经常使用FIRST,所以我希望使用misc::CData::FIRST静态地访问它,而不需要在作用域中的某个地方声明它。这有可能吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-20 18:31:39

..。不需要在范围内的某个地方声明它。这有可能吗?

不,不声明它是不可能的(您已经尝试在类声明中这样做)。您可能是指,而不是在类声明之外定义它。答案也是否定的。

在这种情况下,您必须分离声明和定义(它只适用于int这样的原始积分类型,以便在类声明中直接初始化这些类型)。

首先,在类声明中有一个简单的声明(通常类似于CData.hpp)

代码语言:javascript
复制
namespace misc {
    class CData {
    public:
        CData( ) { };
        CData( int d );

        CData& operator = ( const CData& d );

        static const CData& FIRST;

    private:
        int data;
    };
}

然后在单独的编译单元中定义它(通常类似于CData.cpp)

代码语言:javascript
复制
namespace misc {
    const CData& CData::FIRST = CData( 512 );
}
票数 3
EN

Stack Overflow用户

发布于 2014-05-20 18:26:58

..。不需要在范围内的某个地方声明它。这有可能吗?

不是的。

C++标准n3337 § 9.4.2/2

静态数据成员

静态数据成员在其类定义中的声明不是定义,可能是不完整的类型,而不是cv限定的void。静态数据成员的定义应出现在包含成员类定义的命名空间范围中。(...)

您可以在类中声明静态数据成员:

代码语言:javascript
复制
namespace misc {
    class CData {
    public:
        //...
        static const CData FIRST;  // declaration
        //...
}

并在(确切地)一个.cpp文件中定义它:

代码语言:javascript
复制
namespace misc {
    CData CData::FIRST = CData( 512 );  // definition
}

这是首选的解决方案,但是您需要将此定义从类中删除。如果成员是整型的,则可以在类中定义它。

C++ n3337 § 9.4.2/3

如果非易失性const静态数据成员为整型或枚举类型,则类定义中的声明可以指定一个大括号或相等的初始化器,其中作为赋值表达式的每个初始化子句都是一个常量表达式(.)

票数 0
EN

Stack Overflow用户

发布于 2014-05-20 18:27:04

对于非整型数据,这种方法是首选的,因为它避免了静态初始化失败。。

代码语言:javascript
复制
static const CData FIRST()
{
    static CData first(512); //only initialized once, when first requested

    return first;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23767241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档