零 OOP
面向对象编程与传统的过程性编程的区别在于,OOP强调的是在运行阶段(而不是编译阶段)进行决策。运行阶段指的是程序正在运行时,编译阶段指的是编译器将程序组合起来时。运行阶段决策就好比度假时,选择参观哪些景点取决于天气和当时的心情;而编译阶段决策更像不管在什么条件下,都坚持预先设定的日程安排。
一、字符
1.字符串常量和字符常量
字符串常量(使用双引号)不能与字符常量(使用单引号)互换。字符常量(如’S’)是字符串常=编码的简写表示。在ASCII系统上,'S’只是83的另一种写法;但是"S"不是字符常量,它表示的是两个字符(字符 S 和 \0)组成的字符串。更糟糕的是,"S"实际上表示的是字符串所在的内存地址。
2.sizeof 和strlen()函数
sizeof运算符指出整个数组的长度,但是strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度。另外,strlen()只计算可见的字符,而不把空字符计算在内。
二、指针
指针是一个变量,其存储的是值的地址,而不是值本身。因此,指针名表示的是地址。对变量运用地址运算符(&)就能获取对应变量的位置。例如:如果home是一个变量,则&home是它的地址。*运算符被称为间接值(indirect value)或解除引用(dereferencing)运算符,将其应用于指针,可以得到该地址处存储的值。(这和乘法使用的符号相同;C++根据上下文来确定所指的是乘法还是解除引用)。
处理存储数据的策略是将地址视为指定的量,而将值视为派生量。
声明和初始化指针
指针声明必须指定指针指向的数据的类型。
顺便说一句,*运算符两边的空格是可选的。传统上,C程序员使用这种格式:
int *ptr;
如果要强调*ptr是一个int类型的值,使用如下格式:
int* ptr;
如果要强调int*是一种类型—指向int的指针。在哪里添加空格对于编译器来说没有任何区别,您甚至可以这样做:
int*ptr;
但要知道的是,下面的声明创建一个指针(p1)和一个int变量(p2):
int* p1,p2;
还有一种书写方式很特别:
int **ptr;
这里ptr是指向int类型指针的指针,故ptr是个指针。
对每个指针变量名,都需要使用一个*
注意:在C++中,int *是一种复合类型,是指向int的指针
最后千万别忘了每条语句最后加上分号
指针的危险
一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。这是关于使用指针的金科玉律。
指针和数字
指针不是整型,虽然计算机通常把地址当作整数来处理。但从概念来看,指针与整数是截然不同的类型。整数是可以执行加、减、除等运算的数字,而指针描述的是位置,将两个地址相乘没有任何意义。从可以对整数和指针执行的操作上看,他们也是彼此不同的。因此,不能简单地将整数赋给指针:
int * pt;
pt = 0xB80000000;// type mismatch
如上所示的代码是错误的,原因在于左边是指向int的指针,因此可以把它赋给地址,但是右边是一个整数。0xB80000000是老式计算机系统中视频内存的组合段偏移地址,但这条语句并没有告诉程序,这个数字就是一个地址。在C99标准发布之前,C语言允许这样赋值。但C++在类型一直方面的要求更严格,编译器将显示一条错误消息,通告类型不匹配。要将数字值作为