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

在C++类声明中初始化const成员
EN

Stack Overflow用户
提问于 2012-02-04 15:29:26
回答 5查看 97.5K关注 0票数 90

在PHP和C#中,可以在声明常量时初始化它们:

代码语言:javascript
复制
class Calendar3
{
    const int value1 = 12;
    const double value2 = 0.001;
}

下面是函子的C++声明,它与另一个类一起用于比较两个数学向量:

代码语言:javascript
复制
struct equal_vec
{
    bool operator() (const Vector3D& a, const Vector3D& b) const
    {
        Vector3D dist = b - a;
        return ( dist.length2() <= tolerance );
    }

    static const float tolerance = 0.001;
};

这段代码编译时没有g++问题。现在,在C++0x模式(-std=c++0x)中,g++编译器输出一条错误消息:

错误:非整型静态数据成员的类内初始化所需的“常数”

我知道我可以在类定义之外定义和初始化这个static const成员。此外,可以在构造函数的初始化程序列表中初始化非静态常量数据成员.

但是,是否有任何方法可以像在PHP或C#中一样初始化类声明中的常量?

更新

我使用static关键字只是因为可以在g++中的类声明中初始化这些常量。我只需要一种方法在类声明中初始化一个常量,不管它是否声明为static

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-09 09:35:27

在C++11中,可以在类声明中初始化非static数据成员、static constexpr数据成员和整数或枚举类型的static const数据成员。例如:

代码语言:javascript
复制
struct X {
    int i=5;
    const float f=3.12f;
    static const int j=42;
    static constexpr float g=9.5f;
};

在这种情况下,类X的所有实例的X成员被编译器生成的构造函数初始化为5,而f成员被初始化为3.12static const数据成员j初始化为42static constexpr数据成员g初始化为9.5

由于floatdouble不是整数或枚举类型的,这些成员必须是constexpr或非static,才能允许类定义中的初始化器。

在C++11之前,只有整数或枚举类型的static const数据成员才能在类定义中具有初始化器。

票数 155
EN

Stack Overflow用户

发布于 2012-02-08 19:48:54

初始化const类型以外的静态成员变量不是标准的C++以前的C++11。除非指定-pedantic选项,否则gcc编译器不会对此发出警告(但仍然会产生有用的代码)。然后,您应该得到一个类似于以下错误的错误:

代码语言:javascript
复制
const.cpp:3:36: error: floating-point literal cannot appear in a constant-expression
const.cpp:3:36: warning: ISO C++ forbids initialization of member constant ‘tolerance’ of non-integral type ‘const float’ [-pedantic]

其原因是C++标准没有具体说明如何实现浮点,而是留给处理器处理。为了克服这一限制和其他限制,引入了constexpr

票数 48
EN

Stack Overflow用户

发布于 2012-02-04 15:30:56

是。只需按错误说明添加constexpr关键字即可。

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

https://stackoverflow.com/questions/9141950

复制
相关文章

相似问题

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