读书笔记:《C++程序设计教程(修订版)------设计思想与实现 》 [钱能,清华大学出版社]

来源:互联网 发布:win7系统优化提速 编辑:程序博客网 时间:2024/05/20 05:28

第一部分 C++过程化语言基础

第1章 C++入门

1.6 最简单的程序

C++的程序结构由注释、编译预处理和程序主体组成。

C++忽略注释,并把每个注释都视为一个空格。

每个以符号#开头的行,称为编译预处理行。

每一个C++程序都必须有一个main( )函数,且只能有一个。

C++程序中的名字是大小写敏感的。

描述一个函数所执行算法的过程称之为函数定义。

C++中,一个变量必须在声明之后才能使用,定义变量,意味着给变量分配内存空间。

1.7 函数

函数定义由函数头和函数体构成,函数头又由返回类型、函数名和函数参数构成。

函数定义中的参数成为形式参数,调用函数时实际传递的值称为实际参数。

函数定义包含函数声明。

第2章 基本数据类型与输入输出

2.3 变量定义

4. typedef

用typedef可以为一个已有的类型名提供一个同义词。

typedef没有实际地定义一个新的数据类型,在建立一个typedef类型是没有分配内存空间,在程序中仅起到帮助理解的作用。

typedef double profit; //定义double的同义词typedef int INT,integer; //定义int的两个同义词

2.4 字面量

1. 整形数

整形数可用3种表示方式:十进制整数(有正负之分),八进制整数(以0开头,无正负之分),十六进制整数(以0X或0x开头,无正负之分)。

2. 实型数

实型数分为单精度(float)、双精度(double)和长双精度(long double)3类。

34.5 //float型34.5 //double型(默认表示)34.5l //long double型

3. 字符

字符是用单引号括起来的一个字符。

将一个字符赋值给字符变量,实际上并不是把该字符本身放到内存单元,而是将该字符的相应ASCII码存储,即以整数表示。所以C++中字符数据和整形数据之间可以互相赋值,只要注意其表示的范围合理。

int a='b'; //ok: 给一个整型变量附一个字符值char c=97; //ok: 给一个字符变量附一个整型值cout<<a<<endl;cout<<c<<endl;
其结果为:

98

a

4. 字符串

字符串是由一对双引号括起来的字符序列。

在C++中字符串总是以\0结束。

5. 枚举符

enum COLOR{RED,BLUE,GREEN,WHITE,BLACK};
COLOR是枚举类型名,不是变量名,不占内存空间。

如果没有专门指定,第1个符号常量的枚举值就是0,其他枚举值依次为1往上加。

不能用整数值赋给枚举变量。

COLOR paint=GREEN; //定义了枚举类型后,可以定义该枚举类型的变量,变量的取值只能取枚举类型定义时规定的值。paint=200; //error

2.5 常量

定义成const后的常量,定义时必须初始化,程序中对其只能读不能修改。

const float pi=3.141592653; //ok: 由于有效位的限制,最后3位不起作用const float pi;pi=3.1415926; //error
c++编程中,常量定义都用const,不用#define。

#define PI 3.1415926 //由于它不是C++语句,所以行末不用分号。PI在编译预处理完成后全部被字串3.1415926所替代。

第3章 表达式和语句

左值表达式具有存放数据的空间,并且存放是允许的。
变量可作左值可作右值,常量只能作右值不能做左值。

第4章 过程化语句

continue语句是终止本次循环,继续循环判断。break语句是终止整个循环,不再进行条件判断。

第5章 函数

5.1 函数概述

C++不允许函数定义嵌套,即在函数定义中再定义一个函数是非法的。

5.2 函数原型

函数的返回值也称函数值。返回的不是函数本身,而是一个值。

5.4 函数调用机制

栈工作原理:先进后出,后进先出(子弹)。栈是有限的资源,每次调用一个函数,剩余的栈空间就会减少。

5.5 静态局部变量

局部变量前加上static关键字就成了静态局部变量。静态局部变量始终存放在内存的全局数据区,不因为函数的结束而消失,直到程序运行结束。

5.8 重载函数

重载函数至少在参数个数、参数类型或参数顺序上有所不同。

第6章 程序结构

6.1 外部存储类型

extern

带extern的变量说明是变量声明,不是变量定义。

6.2 静态存储类型

在全局变量前加一个static,称之为全局静态变量,该变量值在这个源文件中可用,对组成该程序的其它源文件是无效的。

默认的函数声明或定义是extern的。

第7章 数组

7.1 数组定义

类型说明符 数组名[常量表达式];

数组定义中的下标必须确定。

int size=50;int main(){int array[size]; //error//...}

const int size=50;const int n=size*sizeof(int);int main(){int array[size]; //okchar charray[n]; //ok//...}

7.3 初始化数组

初始化数组的值不能通过跳过逗号的方式来省略。

第8章 指针

8.1 指针概念

指针变量的定义语句,由数据类型后跟星号,再跟随指针变量名组成。

在指针定义中,一个*只能表示一个指针。

&操作符可以获取变量的地址,指针变量用于存放地址。

int * iPtr;int iCount=18;iPtr=&iCount; //将地址赋给存放地址的变量(指针)
*的三种用法:

A.乘法

B.定义指针(*放在指针定义中时称指针定义符)

C.间接引用(*放在可执行语句的指针之前,称之为间接引用操作符)

间接引用指针时,可获得由该指针指向的变量内容。

#include<iostream>using namespace std;int main(){int * iPtr;int iCount=18;iPtr=&iCount;cout<<*iPtr<<endl; //间接引用指针}
运行结果为:

18

间接引用的指针既可用于右值,也可用于左值。
指针在使用前,要进行初始化。

8.4 堆内存分配

堆(heap)是区别于栈区、全局数据区和代码去的另一个内存区域。堆允许程序在运行时(而不是在编译时),申请某个大小的内存空间。

8.7 字符指针

3. 字符指针

字符串是地址

输出字符指针就是输出字符串

输出字符指针的间接引用,就是输出单个字符

4. 字符串比较

两个字符串比较是地址的比较

两个数组名比较是地址的比较

第9章 引用

9.1 引用的概念

引用是个别名。引用运算符&只在声明的时候使用,放在类型名后面。引用只有声明没有定义,在声明时必须初始化,不占存储空间。

int intOne;int& rInt = intOne;
任何其他&的使用都是地址操作符,例如:

int * ip=&intOne;cout<<&ip;

9.3 什么能被引用

void& a=3; //error
int a[10];int& ra[10]=a; //error
int a;int& ra=a;int& *p=&ra; //error 企图定义一个引用的指针
int& ra=int; //error
int& ri=NULL; //毫无意义

第10章 结构

10.1 结构概述

结构是用户自定义的新数据类型。

声明结构在所有函数之外,位于main( )函数之前。

声明一个结构并不分配内存,内存分配发生在定义这个新数据类型的变量中。

通过定义相应结构变量,分配了空间,就可以用点操作符.来访问结构中的成员。

10.2 结构与指针

结构变量的地址是结构第一个成员地址。可以将结构变量的地址赋给结构指针,结构指针通过箭头操作符->来访问结构中的成员。

10.4 传递结构参数

当结构很大时,引用传递的优越性才真正开始体现。在编程经验上,除非是小结构,一般很少按值传递。

10.6 链表结构

结构可以嵌套,及结构中可以包含结构成员。

结构成员不能是自身的结构变量,但可以用自身结构指针作为成员。

通过含有一个自身结构的指针,我们可以实现随机分布的结构变量的遍历。

struct List{char name[20];List* pH;  //List结构指针作为其成员List m;  //error};

第二部分 面向对象程序设计

第11章 类

11.1 从结构到类

C++的类(class)定义中默认情况下的成员是private的,而结构(struct)定义中默认情况下的成员是public的。

11.3 定义成员函数

: :叫做作用域区分符,指明一个函数或一个数据属于哪个类。: :可以不跟类名,表示全局数据或全局函数。

在类定义的成员函数一般规模都比较小,而且特别的switch语句不允许使用。它们一般为内联函数。

第12章 构造函数

12.3 构造函数的使用

C++规定与类同名的成员函数是构造函数,在该类的对象创建时自动被调用。用于创建对象和为其初始化。

构造函数没有返回类型,函数体中也不允许返回值,但可以有无值的返回语句return;

12.4 析构函数

析构函数在构造函数名前加上一个逻辑非运算符~,表示“逆构造函数”。析构函数没有返回类型,没有参数,不能随意调用,也没有重载。只是在类对象生命期结束的时候,由系统自动调用。

......

构造函数可以带参数。

构造函数可以重载。

C++提供的默认构造函数,仅负责创建对象,而不做任何初始化工作。

12.9 构造类成员(看P.283)

在构造函数头后面的冒号:表示后面要对类的数据成员的构造函数进行调用。

冒号语法使得常量数据成员和引用数据成员的初始化成为可能。

第13章 面向对象程序设计

在构造函数头后面的冒号:表示后面要对类的数据成员的构造函数进行调用。

冒号语法使得常量数据成员和引用数据成员的初始化成为可能。

第14章 堆与拷贝构造函数

14.1 关于堆

C++程序的内存格局通常分为四个区:

(1)全局数据区(data area)存放全局变量、静态数据、常量; 

(2)代码区(code area)存放所有类成员函数和非成员函数代码;

(3)栈区(stack area)存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址;
(4)堆区(即自由存储区)(heap area)余下空间。
操作堆内存时,如果分配了内存,就有责任回收它,否则运行的程序将会造成内存泄露。
每次使用运算符new动态分配内存时,都应测试new的返回指针值,成功则指向该内存的空间,失败则返回NULL。

第15章 静态成员与友元

15.2 静态成员的使用

静态成员用static声明。

静态数据成员在类声明外分配空间和初始化。

使用静态数据成员,实际上可以消灭全局变量。

15.4 静态成员函数

静态成员函数没有this指针。

15.6 友元的使用

在类里声明一个普通函数,标上关键字friend,就成了该类的友元。该函数可以直接访问一个类的保护或私有数据成员。

第16章 继承

16.2 继承的工作方式

子类 父类。

......

虚函数,在成员函数前加virtual关键字。

16.13 抽象类

抽象类是一个不能有实例对象的类,唯一用途是被继承。

一个抽象类至少具有一个纯虚函数。
virtual void Withdrawal(float amount)=0;//纯虚函数

16.14 由抽象类派生具体类

第17章 多重继承

17.3 虚拟继承

子类 virtual父类。

第18章 运算符重载

18.2 如何重载运算符

返回类型 operator 运算符号(参数说明);

class A{ };int operator+(A&, A&); //两个A类对象参加运算,返回int型值

第19章 I/O流

第20章 模板

第21章 异常处理

(1)定义异常(try语句块)。将那些有可能产生错误的语句框定在try块中; 

(2)定义异常处理(catch语句块)。将异常处理的语句放在catch块中,以便异常被传递过来时就处理它;

(3)抛掷异常(throw语句)。检测是否产生异常,若是则抛掷异常。