使用 const 成员变量索引数组

Posted

技术标签:

【中文标题】使用 const 成员变量索引数组【英文标题】:Index an array using a const member variable 【发布时间】:2019-09-08 10:51:14 【问题描述】:

我有以下课程。我想使用成员size 作为arr1 的索引,我将填写构造函数。但是,编译器不会编译并说“无法初始化可变大小的对象”。如果size 是一个常量,这怎么可能?

另一方面,arr2 使用 siz 正确填充。

class myclass 
public:
    myclass() 
            
        int arr1[size] =  1, 2 ;

        const size_t siz = 2;
        int arr2[siz]  1, 2 ;
    ;

    const size_t size = 2;
;

【问题讨论】:

【参考方案1】:

因为索引,真正的意思是大小,是一个非静态的、非 constexpr 的类成员,它的值在初始化之前是未知的。您需要的是编译时间常数。您可以通过几种不同的方式解决此问题,例如

class myclass 
  enum  SIZE = 2 ;  // this
 public:
  static constexpr size_t kSize = 2;  // or that
  myclass() : size(2) 
    int arr1[SIZE] =  1, 2 ;
    int arr2[kSize] =  1, 2 ;
    ...
  
  ...
;

请记住,静态类成员的分配方式是每个类实例化都看到相同的值,并且如果 public 在没有实例化的情况下可见。此外,函数体内的每个静态变量都以这样的方式分配,每次调用此类函数时都会看到最新的值。

【讨论】:

【参考方案2】:

它不起作用的原因是你可以在构造函数中更改它:

myclass() : index(3)

    //...

你只是默认初始化了 const 成员。

你没有理由不在这里使用 std::Vector


您可以通过将其设为静态来使其工作(坏主意):

static const size_t index = 2;

PS.index 在这里是个坏名字,你的意思是数组的大小而不是它的索引。

【讨论】:

好了,可以在构造函数中修改成员了。但是,据我所知,我初始化该成员的方式与您在构造函数中初始化它的方式相同。另外,我看不到如何在运行时修改该成员,所以我认为它应该可以工作。谢谢你。 Vector 看起来是一个更好的选择,但我想知道为什么这不起作用。 PS。该成员的姓名已被修改。 @AnselmoGPP 您可以在构造中更改它的事实,使其可变。想想这个:myclass(size_t ic) : index(ic)。它是运行时间常数。您刚刚承诺在初始化时不会更改它

以上是关于使用 const 成员变量索引数组的主要内容,如果未能解决你的问题,请参考以下文章

C++const成员规则

C++中如何可以修改const函数内的成员变量的值?

NO.3 尽量使用const

如何将静态 const 变量保留为类的成员

const成员变量

C++面向对象-static、const