我似乎对C ++中的“静态”有一些误解

托马斯·阿尚(Tomas Aschan)

对于static关键字在C ++中的工作方式,我似乎有一些误解具体来说,我需要了解以下代码的问题:

#include <iostream>

struct A{
    int a;

    A(int ain) : a(ain) { }
    A() : a(1) { }

    static A getA()
    {
        return A(2);
    }
};

struct B
{
    static A a = A::getA();
};


int main() {
    std::cout << B::a.a << std::endl;
}

如果static按预期工作,上面的代码示例将2正常打印并退出-相反,我收到以下编译器错误消息:

g++    -c -o syntax.o syntax.cpp
syntax.cpp:17:21: error: ‘A::getA()’ cannot appear in a constant-expression
     static A a = A::getA();
                     ^
syntax.cpp:17:26: error: a function call cannot appear in a constant-expression
     static A a = A::getA();
                          ^
syntax.cpp:17:26: error: invalid in-class initialization of static data member of non-integral type ‘A’
syntax.cpp:17:26: error: initializer invalid for static member with constructor
syntax.cpp:17:26: error: (an out of class initialization is required)
syntax.cpp:17:26: error: ‘B::a’ cannot be initialized by a non-constant expression when being declared
make: *** [syntax.o] Error 1

阅读错误消息后,我意识到static我尚不了解其中的某些内容,但是我发现很难查明是什么可能是因为我在Java和C#等语言中做了很多工作,它们也有static关键字,但显然在工作方式上有所不同。

有人可以告诉我为什么上面的代码无效吗?

菲利普·罗森-refp

静态成员功能

有两种方法可以调用给定静态成员函数T

  • 您使用范围解析运算符::,或者

  • 您可以T使用operator.在变量上调用其他任何成员函数)上述类型的实例上调用它


法律架构

struct Obj {
  static void func () { 
    /* ... */
  }
};

以下两个两个片段调用静态成员函数funcObj

Obj a; a.func ();

Obj::func ();


违法建筑

Obj a;

Obj.func (); // illegal, `Obj` is a type and not an instance
a ::func ();  // illegal, `a` is an instance of `Obj`, not a type


静态数据成员

static数据成员用于声明在给定类型的每个实例之间共享的变量。

在问题提供的代码段中,您尝试使用更正后的返回值初始化a类型为的静态数据成员不允许这样做,因为尝试初始化数据成员而不使其成为类内初始化的非法构造。AA::getA ()staticconstexpr

struct B {
  static A a = A::getA(); // illegal, `static A a` is not `constexpr`
};

有关静态数据成员的类内初始化的更多信息,请参见:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我对HTML中的字体颜色有一些疑问

来自分类Dev

我在python中的xpath有一些问题

来自分类Dev

我需要一些有关静态和媒体文件的建议

来自分类Dev

我需要一些有关静态和媒体文件的建议

来自分类Dev

有关C ++中Linter的一些疑问

来自分类Dev

我似乎缺少了一些东西。

来自分类Dev

Lemon Parser跳过了一些事情(或者我的误解)

来自分类Dev

Lemon Parser跳过了一些事情(或者是我的误解)

来自分类Dev

在Ubuntu 14.04 LTS上的usr / share / themes中似乎有一些主题

来自分类Dev

我无法在C中执行一些输入

来自分类Dev

我的css样式中只有一些出现在我的html文件中

来自分类Dev

我的C ++计算器似乎有什么问题?

来自分类Dev

我的C程序中的continue语句似乎不起作用

来自分类Dev

R的新手。我有一些Stata的代码,我想在R中重现

来自分类Dev

我们可以在Java 6中有一些JavaFX类吗

来自分类Dev

一些?>出现在我的页面中,所有选择的标签都已关闭

来自分类Dev

我需要有关wordpress中的ajax的一些帮助,始终返回0

来自分类Dev

我只想使用 JSOUP 向现有 HTML 中永久添加一些 html 标签

来自分类Dev

我如何删除一些在文件内容中具有值的数据属性?

来自分类Dev

如何查找我的表单中是否有一些不恰当的词

来自分类Dev

在C / C ++中是否有一些特别优化的memcpy2d?

来自分类Dev

我有一个在 C 中似乎找不到的分段错误

来自分类Dev

有关C#中IEnumerable接口的一些说明?

来自分类Dev

有关如何从C#中的XML文档正确提取DateTime的一些信息?

来自分类Dev

如何在C#中创建Fluent接口,但对某些方法有一些限制?

来自分类Dev

有关c中的traceroute的一些相关问题:

来自分类Dev

如何在C ++中从文件读取char数组(有一些空间)

来自分类Dev

在C#中是否有一些行业“标准”用于高级元编程?

来自分类Dev

有一些访问C多维数组中的字符串的特定方法吗?

Related 相关文章

  1. 1

    我对HTML中的字体颜色有一些疑问

  2. 2

    我在python中的xpath有一些问题

  3. 3

    我需要一些有关静态和媒体文件的建议

  4. 4

    我需要一些有关静态和媒体文件的建议

  5. 5

    有关C ++中Linter的一些疑问

  6. 6

    我似乎缺少了一些东西。

  7. 7

    Lemon Parser跳过了一些事情(或者我的误解)

  8. 8

    Lemon Parser跳过了一些事情(或者是我的误解)

  9. 9

    在Ubuntu 14.04 LTS上的usr / share / themes中似乎有一些主题

  10. 10

    我无法在C中执行一些输入

  11. 11

    我的css样式中只有一些出现在我的html文件中

  12. 12

    我的C ++计算器似乎有什么问题?

  13. 13

    我的C程序中的continue语句似乎不起作用

  14. 14

    R的新手。我有一些Stata的代码,我想在R中重现

  15. 15

    我们可以在Java 6中有一些JavaFX类吗

  16. 16

    一些?>出现在我的页面中,所有选择的标签都已关闭

  17. 17

    我需要有关wordpress中的ajax的一些帮助,始终返回0

  18. 18

    我只想使用 JSOUP 向现有 HTML 中永久添加一些 html 标签

  19. 19

    我如何删除一些在文件内容中具有值的数据属性?

  20. 20

    如何查找我的表单中是否有一些不恰当的词

  21. 21

    在C / C ++中是否有一些特别优化的memcpy2d?

  22. 22

    我有一个在 C 中似乎找不到的分段错误

  23. 23

    有关C#中IEnumerable接口的一些说明?

  24. 24

    有关如何从C#中的XML文档正确提取DateTime的一些信息?

  25. 25

    如何在C#中创建Fluent接口,但对某些方法有一些限制?

  26. 26

    有关c中的traceroute的一些相关问题:

  27. 27

    如何在C ++中从文件读取char数组(有一些空间)

  28. 28

    在C#中是否有一些行业“标准”用于高级元编程?

  29. 29

    有一些访问C多维数组中的字符串的特定方法吗?

热门标签

归档