2013-02-26 151 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