数组有何不好之处
从时间和空间的角度来讲,数组是访问内存中连续对象的最佳结构。然而,它同时也是非常底层的数据结构,不当地使用它常常会导致大量潜在的错误。而且,基本上在所有需要用到数组的地方,我们都有更好的替代品。我所说的“更好”是指更易于读写、不易导致错误,以及同等效率。
C++应该说是计算机语言里最难的,所以有很多问题会让学习C++的人不理解,比如为什么java可以设计哪么好用,为什么C++不可以。主要从这些方面讨论一下,讲为什么会设计成这样
从时间和空间的角度来讲,数组是访问内存中连续对象的最佳结构。然而,它同时也是非常底层的数据结构,不当地使用它常常会导致大量潜在的错误。而且,基本上在所有需要用到数组的地方,我们都有更好的替代品。我所说的“更好”是指更易于读写、不易导致错误,以及同等效率。
“malloc()”是个函数,接受(字节)数目作为参数;它返回一个指向未初始化空间的 void * 指针。“new”是个运算符,接受一个类型以及一套该类型的初始值(可选)作为参数;它返回一个指向已被初始化(可选)的该类型的对象的指针。当你想为带有非平凡初始化语义(non-trivial initialization semantics)的用户自定义类型分配空间时,这两者的区别是很明显的。
不,它们的效率并不低下。或许“和什么比较?”会是一个更有用的回答。当人们抱怨标准库容器的性能时,通常会是以下三个现实问题之一:
C++ 标准库提供了一套非常好用的、静态类型安全的、高效的容器。例如 vector、list,以及 map:
不是这样。generics 其实是为抽象类而设的语法;亦即,利用 generics(无论是 Java generics 或 C# generics),你从此不再需要定义精确的接口,但相对地,你也要为此付出诸如虚函数调用以及/或者动态类型转换的花销。
因为这将降低类型系统的安全性
我们不需要这个:大多数情况下,泛型编程提供的静态类型安全机制是非常不错的替代品。其它情况可使用多继承(multiple inheritance)来解决。
不存在有用的通用类:纯粹的通用类本身不含任何语义。
“通用”类会怂恿人们对类型和接口的考虑粗枝大叶,从而导致多余的运行时检查。
纯虚函数是指不必在基类中定义,但必须在派生类中被覆盖(override)的函数。通过新奇的“=0”语法可将虚函数声明为纯虚函数。例如:
类似这样的问题千奇百怪。例如:
1.为什么我明明不想复制对象,而编译器却偏偏这么做了呢?
2.如何关闭复制机制?
3.如何防止隐式转换?
4.为何 int 自动转换成了复数?
正常情况下退出作用域时都会调用析构函数,不过有时也会有这种问题,先看下例子:
也就是说,有些人误以为 new 创建的对象会在函数的最后被析构。
基本上,只有当你希望一个对象能“生存”于其被创建的域之外时,才应该使用“ new”。如果这样,你就需要使用“delete”来析构该对象。例如: