笔记范围:2.1节到2.2节
很多人都会觉得第二章很难,作者在第一篇的引言中也提到:如果读者觉得第二章的内容难以理解,就跳过他。而个人认为这样做不是最好的选择,事实上,第一篇的目的在于对这语言有个很好的整体的理解,思维上的习惯,方法论的形成才是本章的重点,前面这些废话,是对我们将要面对的难度以及我们要采取的态度作一个简单的说明和建议,
我们在第一章中学的那些东西,都是比较现成的、可以直接使用的、在用的过程中不太会受到语法上的限制的东西,我想大家还记得我在读到数据类型的时候,有过一个疑问:为什么那个时候作者不说数组?在2.1节里,作者给出了个答案:数组不属于基本型,什么是基本类型呢?作者的解释是:语言本身对该类型的赋值、一般算术运算和关系运算提供内置支持。显然数组和指针都不能满足这个条件,按作者的原话:他们不是一等公民,
关于这两节的知识点。我想要说的并不多,对于学过一点编程的人来说数组和指针不是什么陌生的东西。在这本书的前言里作者就说过“这本书适合c++的初学者,但不是适合编程的初学者”,但是这里仍然有两个很多初学者会犯的低级错误:
数组方面:我来举个例子:
Int a[8];.
a[8]=10;
这两个8几乎完全相同。事实是:在意义、作用上都完全是两回事,前者是size,后者是下标、这里我不得不产生一个疑问:[]运算符到底是干嘛的?在这里我们几乎第一次看到了一符多用的例子(也许不是,姑且这样认为)。
指针方面。我见过很多类似这样的用法:
int *p = NULL;
cout << *p << end ;
显然,一个合格的程序员不会写这样的代码的、但是要不是一个朋友的提醒。我也就自以为是的认为它只能是个笨蛋的错误,这里有两个问题:NULL是什么?我以前很天真的把它和ASCII联系起来,事实上。它就是0。为一能的赋予p的值。接下来就是空间分配的问题了,我们都知道NULL的作用是不让指针指向任何对程序有用的空间。那么0放那呢?显然这儿有个关于空间的误解,那就是指针的空间和指针指向的空间是不同的。指针的空间是定义时已经分配了,但它只能放内存地址和NULL(p), 指向的空间是容器里的东西(*p),显然,上面的*p事实上并不存在。取一个不存在的东西,当然是不能不出毛病的。
作者在这里很讲到new。一直以来我对new总是有点恐惧感,他远远不如c的函数来的明白,作者告诉我们它是动态分配内存的运算符。可是请注意作者对于动态分配的解释:“运行时刻库函数的行为”。库函数?no运算符?这里我们几乎感觉到了,函数和运算符之间存在着某种联系。再深入点思考,想想我们在开头提到的关于数组的缺点,数组不能进行某些运算?well,如果我们的假设成立,函数和运算符存在联系,那么我们自己是不是可以完善下我们的数组呢?事实证明我们是正确的。这就引出了ADT的思想-类的设计(后面的内容就是个不断设计完善的过程)。可见我们以前的学习方法存在一个大问题,我们不知道自己为什么要学一样东西,作者已经暗示我们这样的答案。需求引发灵感,灵感带动设计,设计成就技术,技术造成学习。学习满足需求