2012-02-13 145 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