2013-02-26 147 views
0

爲什麼C++中的數組在C++ 11(std :: array)之前沒有成員函數size()?這背後的原因是什麼?像'如何獲取數組的大小?'等問題相當頻繁。爲什麼C++中的數組在C++ 11之前沒有成員函數size()?

作爲普通陣列由C繼承,什麼是它不具有這樣的功能的原因是什麼?因爲我們可以檢查數組中的數據類型。

+3

原因是'std :: array'在C++ 11之前並不是C++的一部分。 'std :: tr1 :: array'有一個'size()'成員函數。 – juanchopanza 2013-02-26 20:55:36

+2

原始數組沒有成員,它們不是類。數組是「原始」類型(ish)。在C++ 11中,唯一改變的是一個新的'std :: array'類被添加到標準庫中,C++ 03有一個'tr1 :: array'類多年和數年。 – 2013-02-26 20:55:51

+1

數組和'std :: array'之間是有區別的。你似乎混淆了兩者,而且這很混亂。 C++數組沒有,並且沒有'size()'成員函數。 'std :: array's(它們不是語言數組,但是庫數組)。 – GManNickG 2013-02-26 21:12:10

回答

2

C++(不是std :: array)中的數組與C中的數組沒有區別。它們只是一個連續的內存區域,用於在內存中保存一些數據(相同類型的)。

該類型可以是基本數據類型,如int,float,char等或複雜的數據類型,如結構或類。不論在訪問該陣列的一個元件被剛剛轉換爲:

base address + (sizeof(datatype) * index) 

相反的std ::陣列是重載數組訪問[]操作,並且具有特殊的方法來檢索大小的類。它與std :: vector非常相似。這些類在內部可以使用數組來訪問元素,但是通過重載[]運算符可以巧妙地隱藏這些類。

4

因爲它們來自C,並且C沒有成員函數(甚至數組甚至是類類型)。

與C的兼容性非常重要,因爲允許現有C代碼庫進行編譯,因爲C++大大提高了語言的採用率。當你擁有新的語言功能進行設計時,在擔心兼容性的同時,在優先級清單上貶低一些有用的東西是不夠的。

在C++ 11中,語言達到了所有這些美好的小事物都已經存在的程度。那麼爲什麼不加上現在?因爲C數組仍然可以正常工作,所以要改變這種情況需要很多工作。引入一個新的容器(以及一個非常簡單的容器)容易得多,而這正是發生的情況。

3

std::array是一個模板類,就像其他容器類一樣。 Plain數組在C++ 11中仍然沒有成員。

由於純數組是從C繼承的,它沒有這種功能的原因是什麼?

可以找出元素的量在一個普通的陣列,使用操作者sizeof

int a[10]; 
std::cout << sizeof(a)/sizeof(*a); 

這將打印 「10」。你可能會讓數組與指針混淆。這裏:

int* a = new int[10]; 

a陣列。這是一個指針。

+0

提問者似乎已經知道這一切。他問*爲什麼這是事實。 – GManNickG 2013-02-26 21:03:35

+0

@GManNickG這不是我對這個問題的理解,因爲std :: array是C++ 11的新手。這在前面的標準中沒有,所以問爲什麼它沒有size()成員是沒有意義的。 – 2013-02-26 21:08:01

+0

咦?如果在「它沒有size()成員」中的「it」,你的意思是'std :: array',我們正在閱讀不同的問題。他問爲什麼數組(不是'std :: array',他指出實現數組概念的新C++ 11方法)沒有'size()'成員。 – GManNickG 2013-02-26 21:10:39

3

原始數組不是一個對象,因此沒有成員函數。 std::array是一個封裝數組的類,因此可以具有成員函數和邏輯來獲取數組的長度。

如果你喜歡聲明數組:

int * myArray = new int[5]; 

它不會有任何的方法來獲得它的長度。

1

C數組具有已知和可檢索的大小 - 可由sizeof運算符訪問。你看起來很混亂的數組和指針。我們不知道指針指向的內存塊有多大,如果我告訴過你我住在唐寧街10號,那麼你可以告訴我,我街上有多少房屋。

C數組實際上只是指針的特例。它們直接分配在堆棧上,而它們聲明的原始數組變量是可見的,編譯器能夠告訴我們數組的大小。然而,數組經常分解成指針。這可能是因爲它傳遞給另一個方法或存儲在另一個變量中。當發生這種情況時,因爲編譯器不能再100%確定指針指向一個數組(在所有情況下,就是這樣),我們失去了知道指針引用的數組大小的能力。

+0

好點,謝謝 – Qbik 2013-02-26 21:30:20