2012-02-13 107 views
0

我已经遇到多的代码,其基本上看起来像这样:固定尺寸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 x; 
    std::cout<<x.x0()<<"\n"; 
} 

问题是---被宣告为一类构件的固定阵列尺寸是否真的被标准所允许?

+0

只是不要让野猪把你的代码中的这些东西无处不在。 – 2012-02-13 12:17:10

+0

@CJohnson:当我第一次看到它时,我的第一反应是,请你马上摆脱那个 – 2012-02-13 13:01:24

回答

4

没有错与上面的代码。它可能不是写它的最好方式,但它没有任何内在错误。

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

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

3

没有什么错误声明静态数组作为类的成员:

class A 
{ 
    int a[3]; 
}; 
1

这是允许的。

设计方面,这通常不是理想的;数组没有这样一个漂亮的界面为std::array有:

std::array<double,3> xxx_; 

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

xxx_.size() 

std::transform (xxx_.begin(), xxx_.end(), ...); 

等,所以如果你发现自己使用(静态大小)阵列作为容器的大部分时间,你应该std::array更换(其没有空间开销)。如果你需要动态大小的数组,看看std::vector,它有一个小开销(大小+容量,但是,手动分配,你也必须记住大小,所以唯一的开销是容量)。

+0

我个人会使用'vector'或'valarray'。只是为了我的教育:在静态大小的内存随机访问容器中选择'std :: array' vs'std :: valarray' vs'std :: vector'有什么优点和缺点? – 2012-02-13 15:02:06

+1

@ Zhenya:根据我的经验:'valarray'非常适合数字处理,尤其是GNU实现(使用表达式模板)。但它不是容器,它缺少容器所需的'begin()','end()'和其他东西。因此,它不适用于'std :: transform'或基于范围的算法。它仍然是:'array'和'vector'之间的问题仅仅是编译时的大小是否固定。 'array'没有任何空间开销,'vector'必须记住它的大小和容量。但是,取决于优化,差异可能会消失。 – 2012-02-13 15:11:31