【问题标题】:Initialization of const array in C++ [duplicate]C ++中const数组的初始化[重复]
【发布时间】:2013-04-07 11:59:27
【问题描述】:

我需要通过 C++ 中的初始化列表在类构造函数中初始化 const int 数组。

  • 我知道有一个基于使用的简单解决方案 扩展初始化列表。
  • 不过,我还是想避免使用-std=c++11-std=gnu++11
  • 显然,我从一开始就知道它的 size 是 4 并且 内容是{1, 2, 3, 4}

【问题讨论】:

  • 因为 char 只是一个字节,它可以保存 0 到 255 或 -128 到 127 范围内的值,具体取决于它是否带符号。
  • 这是一个错字 :) 我更正了 :)
  • 为什么您需要通过具有一组固定值的初始化列表在类构造函数中初始化const int 数组?为什么不直接将其设为static 成员(因为它的内容不能更改并且不是特定于正在构造的实例)?
  • 如果不是因为您在问题中的最后陈述,您的查询可能会有问题,但正如所写,查尔斯的评论从根本上解决了这个问题。
  • 你是对的。使用静态 const 成员看起来是个好主意。

标签: c++ arrays constructor initialization


【解决方案1】:

我能想到的唯一方法是在不使用 C++11 初始化器列表领域的情况下这样做,就是将它埋在一个结构包装器中,然后在你的构造初始化器列表中对其进行值初始化:

#include <iostream>
using namespace std;

struct ArrayWrap
{
    int content[4];
    int& operator [](size_t n) { return content[n]; }
    int operator [](size_t n) const { return content[n]; }
};

static const ArrayWrap content = { {1,2,3,4} };


struct MyObj
{
    const ArrayWrap arrwrap;

    MyObj() : arrwrap(content) {}
};

int main(int argc, char *argv[])
{
    MyObj obj;
    for (int i=0;i<4;++i)
        cout << obj.arrwrap[i] << ' ';
    cout << endl;

    return EXIT_SUCCESS;
}

输出

1 2 3 4

当从函数中按值返回固定数组时,在 C 中将固定数组埋入结构中是很常见的,在这种情况下,我只是利用 C++ 编译器生成的包装器结构的默认复制ctor。

可能不是您想要的理想解决方案,但它确实有效,并且可以在 C++98 下编译。

【讨论】:

    【解决方案2】:

    好吧,如果您要从候选集中禁止 C++11 解决方案,那么you simply cannot do this

    【讨论】:

    • 如果您能告诉我们如何使用 c++11 做到这一点,那就太好了。
    • @saksham:问题是I want to avoid using -std=c++11 or -std=gnu++11.
    • 我知道,但据我所知,如果可以的话
    • @saksham:要使用 c++11,我们只需要利用初始化列表。您必须在 .hxx 文件中声明类“A”时声明一个变量 const int x[3]。之后在 .cpp 文件中我们必须编写 A() : x{1,2,3} {},其中 A 是存储 x 变量的类的名称(因此 A() 是构造函数)。如果这个解释还不够,我可以给你发一个示例类。
    • @EjdzEs 非常感谢!够了
    猜你喜欢
    • 2016-11-21
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 2013-01-17
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多