首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++类中初始化静态变量?

在C++类中初始化静态变量?
EN

Stack Overflow用户
提问于 2011-02-17 01:29:43
回答 4查看 290.8K关注 0票数 93

我注意到类中的一些函数实际上并没有访问对象,所以我将它们设为static。然后编译器告诉我,他们访问的所有变量也必须是静态的-好吧,到目前为止还可以理解。我有一堆字符串变量,比如

代码语言:javascript
复制
string RE_ANY = "([^\\n]*)";
string RE_ANY_RELUCTANT = "([^\\n]*?)";

以此类推。然后,我将它们都设为static const,因为它们永远不会改变。然而,我的程序只有在我把它们移出类的时候才会编译:否则,MSVC++2010会报错“只有静态常量整型变量才能在类中初始化”。

那真是太不幸了。有解决办法吗?我想把它们留在它们所属的类中。

EN

回答 4

Stack Overflow用户

发布于 2014-07-02 17:36:54

因为是C++11,所以可以用constexpr在一个类中完成。

代码语言:javascript
复制
class stat {
    public:
        // init inside class
        static constexpr double inlineStaticVar = 22;
};

现在可以使用以下命令访问该变量:

代码语言:javascript
复制
stat::inlineStaticVar
票数 21
EN

Stack Overflow用户

发布于 2011-02-17 01:44:50

我觉得值得补充的是,静态变量与常量变量不同。

在类中使用常量变量

代码语言:javascript
复制
struct Foo{
    const int a;
    Foo(int b) : a(b){}
}

我们会像这样声明它

代码语言:javascript
复制
fooA = new Foo(5);
fooB = new Foo(10);
// fooA.a = 5;
// fooB.a = 10;

对于静态变量

代码语言:javascript
复制
struct Bar{
    static int a;
    Foo(int b){
        a = b;
    }
}
Bar::a = 0; // set value for a

它的用法如下

代码语言:javascript
复制
barA = new Bar(5);
barB = new Bar(10);
// barA.a = 10;
// barB.a = 10;
// Bar::a = 10;

你看这里发生了什么。常量变量是随Foo的每个实例一起实例化的,因为Foo是实例化的,每个Foo实例都有一个单独的值,Foo根本不能更改它。

与Bar一样,无论创建多少个Bar实例,它们都只是Bar::a的一个值。它们都共享这个值,你也可以通过它们作为Bar的任何实例来访问它。静态变量还遵守public/private的规则,因此您可以使它只有Bar的实例才能读取Bar::a;

票数 9
EN

Stack Overflow用户

发布于 2015-02-12 02:03:37

如果您的目标是初始化头文件中的静态变量(而不是*.cpp文件,如果您坚持“仅使用头文件”的习惯用法,则可能需要该文件),则可以使用模板解决初始化问题。模板化的静态变量可以在标头中初始化,而不会导致定义多个符号。

请看这里的示例:

Static member initialization in a class template

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

https://stackoverflow.com/questions/5019856

复制
相关文章

相似问题

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