类声明中固定大小的C样式数组

fixed size C-style arrays in class declarations

本文关键字:样式 数组 声明      更新时间:2023-10-16

我遇到了一些代码,基本上看起来像这样:

#include<iostream>
// in a header file
class xxx{
  public:
    xxx() { xxx_[0]=0; xxx_[1]=0; xxx_[2]=0;}
    double x0() const {return xxx_[0];}
  private:
    double xxx_[3];  // ???
};
// in the main.cpp
int main(){
  xxx x;
  std::cout<<x.x0()<<"n";
}

问题是,标准真的允许将固定大小的数组声明为类成员吗?

上面的代码没有任何错误。这可能不是写它的最佳方式,但它本质上没有什么问题

是的,您的类xxx可能包含一个固定大小的数组作为成员。它在C中也是允许的。

编译器,即使在读取头以使用它时,也知道结果是sizeof(xxx)有多大。

将静态数组声明为类的成员没有错:

class A
{
    int a[3];
};

这是允许的。

然而,从设计角度来看,这通常并不理想;数组没有std::array那样好的接口:

std::array<double,3> xxx_;
for (auto it : xxx_) {...}
xxx_.size()
std::transform (xxx_.begin(), xxx_.end(), ...);

等等。因此,如果您发现自己大部分时间都在使用(静态大小的)数组作为容器,则应该将其替换为std::array(它没有空间开销)。如果您需要动态大小的阵列,请查看std::vector,它的开销很小(大小+容量,但是,在手动分配时,您也必须记住大小,因此唯一的开销是容量)。