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

C++ 类声明中固定大小的C样式数组,c++,C++,我遇到了一些代码,基本上如下所示: #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

我遇到了一些代码,基本上如下所示:

#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类{
公众:
xxx(){xxx_[0]=0;xxx_[1]=0;xxx_[2]=0;}
双x0()常量{return xxx_u0];}
私人:
双xxx_uu3];/???
};
//在main.cpp中
int main(){
xxx x;

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

class A
{
    int a[3];
};

上面的代码没有任何错误。它可能不是编写它的最佳方式,但它本身没有任何错误

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

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

这是允许的

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

std::array<double,3> xxx_;

for (auto it : xxx_) {...}

xxx_.size()

std::transform (xxx_.begin(), xxx_.end(), ...);
std::数组xxx\ux;
for(auto-it:xxx{…}
xxx.尺寸()
std::transform(xxx_.begin(),xxx_.end(),…);

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

不要把这些东西乱放在你的代码里。@CJohnson:当我第一次看到它时,我的第一反应是,请你马上把它处理掉好吗?我个人会使用一个
向量
数组
。只是为了我的教育:选择
std::array
vs
std有哪些大的优点和缺点::valarray
vs
std::vector
用于静态大小的连续内存随机访问容器?@Zhenya:根据我的经验:
valarray
非常适合数字运算,尤其是GNU实现(使用表达式模板)。但它不是一个容器,它缺少
begin()
end()
和容器所需的其他内容。因此,它不能用于
std::transform
或基于范围的。它仍然是:
array
vector
之间的问题仅仅是大小是否在编译时固定。
array
没有任何空间开销,
vector
必须记住它的大小和容量。但是,根据优化,差异可能会消失。