2012年5月1日
摘要: 第一章一、知识点1、#include是C语言的保留字,表示要把另一个文件中的内容包含在本文件中。类似的还有sizeof也是一个保留字,同时它还是一个运算符。(P12)2、变量是内存中的一块区域,在程序运行过程中可以修改这块区域中存放的数值。变量的名称是这个内存区域的唯一标识。变量的类型决定了这个内存区域的大小、对所存数值的类型要求。(P13)3、C语言中的基本数据类型及其范围、大小:(P14)4、在赋值语句中,如果等号左边的变量类型为T1,等号右边的变量或常量类型为T2,T1和T2不相同,那么编译器会将等号右边的变量或常量的值,自动转换为一个T1类型的值,再将此值赋给等号左边的变量。这个过程叫 阅读全文
posted @ 2012-05-01 10:09 谷堆旁边 阅读(511) 评论(0) 推荐(0)
摘要: 第十二章一、知识点1、一个操作随着所传递的对象类型的不同能够做出不同的反应,其行为模式成为多态。(P413)2、基类与派生类的同名操作,只要标记上virtual,则该操作便具有多态性。(P416)3、一旦标记基类的函数为虚函数,便有连锁反应,后面继承的类中一切同名成员函数都变成了虚函数。如果是引发实际复制动作的传递,则子类对象完全变成基类对象了,这时候,便不会再有悬念了,即不会有多态了。因为在参数传递的过程中已经将对象的性质做了肯定的转变。而对于确定的对象,是没有选择操作可言的。因此说白了,就是仅仅对于对象的指针和引用的间接访问,才会发生多态现象。(P417)4、虚函数机理:(1)、通过预先设 阅读全文
posted @ 2012-05-01 10:00 谷堆旁边 阅读(264) 评论(0) 推荐(0)
摘要: 第十三章一、知识点1、一般地,一个容器,其元素是基类对象的指针或引用,才有多态可言,若没有指向基类的操作,子类就不能行使多态。(P444)2、抽象类的用途就是被继承。定义抽象类就是在类定义中至少声明一个纯虚函数。所谓纯虚函数是指被标明为不具体实现的虚函数。纯虚函数的声明形式是在虚函数声明形式后跟“=0”。例如:(P446)virtual void withdrawal(double amount) = 0;3、抽象类不允许有实例对象,即不能由抽象类创建对象。抽象类作为基类为其他类服务。(P446)4、只要子类中尚有未被覆盖定义的纯虚函数,那么,子类相对于抽象基类的抽象状态不变。(P447)5、 阅读全文
posted @ 2012-05-01 10:00 谷堆旁边 阅读(259) 评论(0) 推荐(0)
摘要: 第十一章一、知识点1、数据类型:数据类型是一组性质相同的具有一定范围的值集以及定义与这个值集上的一组操作。数据抽象是在原有数据的基础上,描述更高级事物的形态。(P378)2、抽象数据类型是基于已有数据类型而组合生成的复合数据类型。在C++中,类正是抽象数据类型的描述形式。因此,抽象数据类型也是自定义的数据类型。抽象数据类型很好地提供了数据抽象的手段,采用抽象数据类型对数据进行抽象的方法,就是基于对象的编程方法。(P379)3、关于一个串到另一个串的复制方法:(P382)void f(char *s){ string s1 = s, s2 = s; char * st = new char[.. 阅读全文
posted @ 2012-05-01 09:59 谷堆旁边 阅读(200) 评论(0) 推荐(0)
摘要: 第十章一、知识点1、继承就是让子类继承父类的属性和操作,子类可以声明新的属性和操作,还可以剔除那些不适合其用途的父类操作。集成可以让你重用父类的代码,专注于为子类编写新代码。(P348)2、如果类BaseClass 是基类:class BaseClass{ int a, b;public:};则其对象本体含义两个整型空间。派生类继承的方式是在类定义的class类名的后面加上:“public”再加上基类名。如果B继承了BaseClass类,则:class B : public BaseClass{ int c;public:};派生类对象本体包含两个部分,一个为基类部分,既包含两个整型空间,.. 阅读全文
posted @ 2012-05-01 09:58 谷堆旁边 阅读(258) 评论(0) 推荐(0)
摘要: 第九章一、知识点1、对象定义和变量定义一样,当以无初始化的形式:Date d;定义时,若创建全局对象,则以全0位的模式表示对象。若创建局部对象,则以随机值表示对象。(P314)2、构造函数的名称反映了对象创建的一般过程,它是唯一的。类的构造函数承担对象的初始化工作,它旨在使对象初值有意义。(P316)3、作为对象的构造函数,其根本的使命就是创建对象实体。如果创建失败,就该让程序捕捉该异常,或者干脆终止程序的运行。因此构造函数的工作不是以对象体作为返回值,也不是以运行的失败作为继续运行的依据,构造函数的成功运行,确定了对象实体今后的操作合法性,构造函数的失败运行,预示着后继工作无法展开而必须另寻 阅读全文
posted @ 2012-05-01 09:58 谷堆旁边 阅读(545) 评论(0) 推荐(0)
摘要: 第八章一、知识点1、成员函数在定义时不需要日期类参数,而普通函数却必须有,这是因为,成员函数在调用时因为捆绑了对象,其实已经含有对象参数了。(P277)2、C++ 类定义体的花括号对的后面一定得有分号。(P278)3、只要是在类定义中包含的成员函数,就有默认声明内联的性质,也就是说,该成员函数出于被编译自动安排到最佳运行性能的状态。因此,为了获取最佳性能,就应在类编程设计时,尽量把成员函数写入类定义中。(P278)4、如果对象是以对象指针间接访问的形式操作的,则对象与成员函数之间就用双字符的箭头“->”,即形式:(P279)objectName->memberFunctionNam 阅读全文
posted @ 2012-05-01 09:57 谷堆旁边 阅读(314) 评论(0) 推荐(0)
摘要: 第七章一、知识点1、因为头文件总是伴随着提供真正的资源,如函数定义等。因而,它不仅仅包括函数声明,它基本上还包括:(P241)2、全局数据在程序存储结构中置身于全局数据区的位置,全局数据区的整个区域在程序启动时,初始化为0。(P244)3、在程序中,有的函数是为文件中的其他函数服务的,并不对外提供服务,这些函数声明为静态,表示局部于文件。同样有的变量只为本文件服务,也不是全局数据应标以static。这些函数和变量称为静态全局函数和静态全局变量。(P251)4、静态局部变量驻留在全局数据区,默认初始化的值为0,而且不会受函数的调用和返回的影响。函数第一次被调用时,静态局部变量被建立,以后该变量一 阅读全文
posted @ 2012-05-01 09:56 谷堆旁边 阅读(276) 评论(0) 推荐(0)
摘要: 第六章一、知识点1、当既要用函数调用来体现其结构化和可读性,又要使效率尽可能地高。解决办法就是将这种小函数声明为内联(inline)。(P198)inline bool isnumber(char);2、对函数的内联声明必须在调用之前。因为内联函数的代码在程序运行时是直接嵌在调用处执行的,它不影响链接,只在编译时确定运行代码。(P199)3、内联函数体应该尽可能小,且要结构简单,这样嵌入的代码才不会影响调用函数的主体结构。所以内联函数中,不能含有复杂的结构控制语句,如switch和while。如果内联函数有这些语句,则编译将无视内联声明,只是视同普通函数那样产生调用代码。当然递归函数属于结构复 阅读全文
posted @ 2012-05-01 09:55 谷堆旁边 阅读(224) 评论(0) 推荐(0)
摘要: 第五章一、知识点1、为了防止传递指针参数或者引用参数时破坏非本地数据,需要在指针和引用参数上加const修饰,以限制函数体中对参数的写操作。(P164)2、运行时内存布局:一个程序要运行,就要先将可执行程序文件装载到计算机的内存中。装载是操作系统掌控的,一般而言,操作系统将程序装入内存后,将形成一个随时可以运行的进程空间,该进程空间分四个区域,如下图所示:(P165)(1)、代码区存放的是程序的执行代码。所谓执行代码就是索引了的一个个函数块代码,它由函数定义块的编译得到。(2)、全局数据区存放全局数据、常量、文字量、静态全局量和静态局部量。(3)、堆区存放动态内存,供程序随机申请使用。(4)、 阅读全文
posted @ 2012-05-01 09:54 谷堆旁边 阅读(314) 评论(0) 推荐(0)
摘要: 第四章一、知识点1、若干个表达式以逗号操作符隔开,称为逗号表达式。逗号表达式具有值,其值为最后一个子表达式的值。但逗号表达式的求值过程是从左边第一项开始,逐项进行的。(P124)2、浮点数在比较大小时用abs(d1 - d2) < 1e - 05 比用 d1 == d2要合理。(P130)3、关于隐式类型转换:(P 131)4、关于位操作:(P140)5、增量操作:因此,作为表达式的结果,前增量返回的是左值,后增量返回的不是左值。于是:++a++就不正确了,它按照优先级就是++(a++),而a++非左值不能做前增量操作。(P143)6、编译器的“贪吃法则”:所谓贪吃,就是指只要能理解(能 阅读全文
posted @ 2012-05-01 09:52 谷堆旁边 阅读(207) 评论(0) 推荐(0)
摘要: 第三章一、知识点1、数据类型是指:(P84)(1)、一定的数据在计算机内部的表示方式;(2)、该数据所表示的值的集合;(3)、在该数据上的一系列操作。2、通常的计算机语言在计算机内部都是以二进制补码形式表示整数的。将十进制正整数转换成二进制补码形式的整数。转换的方法是采用“除2取余法”,即对被转换的十进制整数除以2,取其余数,并将商再除以2,再取余数,直到商为0.每次除下来的余数按先后构成了从低位到高位的二进制整数。例如:(P85)3、一个十进制负整数,表示成二进制补码形式的整数时,该负整数的对应正整数先转换成二进制数,然后“取补”,规则是“取反加一”,例如:用二进制补码表示的数中,以最高位是 阅读全文
posted @ 2012-05-01 09:49 谷堆旁边 阅读(251) 评论(0) 推荐(0)
摘要: 第二章一、知识点1、switch括号中的表达式只能是整型、字符型或枚举型表达式。(P51)2、“case 值: ”即标号,标号是不能重复的名字,所以每一个case常量表达式的值必须互不相同。例如:(P52)case 'A' : cout << "this is A\n";case 65: cout << "this is 65\n"; // 错:’A‘等于ASCII 码的653、do-while 循环存在结构上的一些问题容易引起错误,例如:int sum = 0;do{ int i = 1; sum += i; i 阅读全文
posted @ 2012-05-01 09:44 谷堆旁边 阅读(279) 评论(0) 推荐(0)
摘要: 第九章 类的构造、析构函数一、知识点1、对于一个类,如果不想编写构造、析构、赋值函数,那么C++编译器将自动为 A 产生四个缺省的函数,如 (P69)A(void); // 缺省的无参数构造函数A(const A &a); // 缺省的拷贝构造函数~A(void); // 缺省的析构函数A & operate =(const A &a); // 缺省的赋值函数“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。2、构造函数初始化表的使用规则:(P70)(1)、如果类存在继承关系,派生类必须在其 阅读全文
posted @ 2012-05-01 09:40 谷堆旁边 阅读(187) 评论(0) 推荐(0)
摘要: 第七章 内存管理一、内存管理1、内存使用规则:(P45)(1)、用malloc 或 new 申请内存之后,应该立即检查指针值是否为NULL 。防止使用指针值为 NULL 的内存。(2)、不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。(3)、避免数组或指针的下标越界,特别要当心发生“多1” 或者 “少1” 操作。(4)、动态内存的申请和释放必须配对,防止内存泄露。(5)、用free 或 delete 释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。2、指针与数组:#includeusing namespace std;int main(){ char str. 阅读全文
posted @ 2012-05-01 09:37 谷堆旁边 阅读(285) 评论(0) 推荐(0)
摘要: 第五章 常量一、知识点1、const与#define的比较:(P33)(1)、const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。(2)、有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。2、类中的const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。不能再类声明中初始化const数据成员。const数据成员的初始化只能在类构造函数的初始化表中进行。建立在整个类中都恒定的 阅读全文
posted @ 2012-05-01 09:33 谷堆旁边 阅读(168) 评论(0) 推荐(0)
摘要: 第三章 命名规则一、知识点1、命名规则:(P23)(1)、在Windows中应用程序的标识符通常采用“大小写”混排的方式,如AddChild。而Unix应用程序的标识符通常采用“小写加下划线”的方式,如add_child。(2)、全局函数的名字应当使用“动词” 或者“ 动词+ 名词”。类的成员函数应当只用“动词”,被省略掉的名词就是对象本身。2、简单的Windows 应用程序命名规则:(P23)(1)、类名和函数名用大写字母开头的单词组合而成。(2)、变量和参数用小写字母开头的单词组合而成。(3)、常量全用大写的字母,用下划线分割单词。(4)、静态变量加前缀s_(表示static)。(5)、如 阅读全文
posted @ 2012-05-01 09:31 谷堆旁边 阅读(249) 评论(0) 推荐(0)
摘要: 第一章 文件结构一、知识点1、头文件编写规则:(P12)(1)、为了防止头文件被重复引用,应当用ifndef/ define/ endif 结构产生预处理块。(2)、用#include <filename.h>格式引用标准库的头文件(编译器将从标准库目录开始搜索)。(3)、用#include "filename.h"格式引用非标准库的头文件(编译器将从用户的工作目录汇总开始搜索)。2、头文件的作用:(P13)(1)、通过头文件来调用库功能。(2)、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的 阅读全文
posted @ 2012-05-01 09:29 谷堆旁边 阅读(258) 评论(0) 推荐(0)
摘要: 第八章一、知识点1、在判断相等的比较表达式时可以把常量放在表达式的左侧。例如:(P130)c == '\t' 改写为 '\t' == c附录A一、知识点1、printf函数是把数据写到标准输出,而fprintf函数则可以把数据写到任何文件中。需要写入的特定文件,将作为fprintf函数的第1个参数,它必须是一个文件指针。因此,printf(stuff);从意义上来说就等效于fprintf(stdout, stuff);当输出数据不是被写入一个文件时,我们可以使用sprintf函数。sprintf函数的第1个参数是一个指向字符数组的指针,sprintf函数将把其输 阅读全文
posted @ 2012-05-01 09:27 谷堆旁边 阅读(1353) 评论(0) 推荐(0)
摘要: 第七章一、知识点1、ANSI C标准所能保证的只是,C实现必须能够区别出前6个字符不同的外部名称。而且,这个定义中并没有区分大写字母与其对应的小写字母,所以在选择外部标识符时应该注意。(P113)2、如果c是一个字符变量,使用 (unsigned) c 就可得到与 c 等价的无符号整数。这是会失败的,因为在将字符 c 转换为无符号整数时,c 将首先被转换为 int 型整数,而此时可能得到非预期的结果。正确的方式是使用语句 (unsigned char) c ,因为一个 unsigned char 类型的字符在转换为无符号整数时无需首先转换为 int 型整数,而是直接进行转换。(P116)3、除 阅读全文
posted @ 2012-05-01 09:25 谷堆旁边 阅读(391) 评论(0) 推荐(0)
摘要: 第六章一、知识点1、getchar和putchar经常被实现为宏,以避免在每次执行输入或者输出一个字符这样简单的操作时,都要调用相应的函数而造成系统效率的下降。(P100)2、宏只是对程序的文本起作用,宏提供了一种对组成C程序的字符进行变换的方式,而并不作用于程序中的对象。(P101)3、对于宏定义:(P101)#define f (x) ((x) - 1)f(x) 代表的是(x) ((x) - 1)。这是因为 f 和后面的(x)之间多了一个空格,如果希望定义f(x) 为 ((x) - 1),必须这样写:#define f(x) ((x) - 1)这一规则不适用于宏调用,而只对宏定义适用。因此 阅读全文
posted @ 2012-05-01 09:24 谷堆旁边 阅读(504) 评论(0) 推荐(0)
摘要: 第五章一、知识点1、对于一个例子:#include <stdio.h>main(){ char c; while((c = getchar()) !=EOF) putchar(c);}getchar函数在一般情况下返回的是标准输入文件中的下一个字符,当没有输入时返回EOF。这依程序乍一看似乎是把标准输入复制到标准输,实则不然。原因在于程序中的变量c被声明为char型,而不是int类型。这意味着c无法容下所有可能的字符,特别是,可能无法容下EOF。(P92)2、更新顺序文件:(P93)3、C语言实现通常都允许程序员进行实际的写操作之前控制产生的输出数量。这种控制能力一般通过库函数se 阅读全文
posted @ 2012-05-01 09:23 谷堆旁边 阅读(496) 评论(0) 推荐(0)
摘要: 第四章一、知识点1、典型的连接器把由编译器或汇编器生成的若干个目标模块,整合成一个被称为载入模块或可执行文件的实体,该实体能够被操作系统直接执行。(P74)2、连接器通常把目标模块看成是由一组外部对象组成的。每个外部对象代表着机器内存中的某个部分,并通过一个外部名称来识别。因此,程序中的每个函数和每个外部变量,如果没有被声明为static,就都是一个外部对象。除了外部对象之外,目标模块还可能包括了对其他模块中的外部对象的引用。当连接器生成载入模块的过程中,它必须同时记录这些外部对象的引用。当连接器读入一个目标模块时,它必须解析出这个目标模块中定义的所有外部对象的引用,并作出标记说明这些外部对象 阅读全文
posted @ 2012-05-01 09:19 谷堆旁边 阅读(195) 评论(0) 推荐(0)
摘要: 第三章一、知识点1、C语言中的数组值得注意的地方有以下两点:(P41)(1)、C语言中只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言中数组的元素可以是任何类型的对象,当然也可以是另外打的一个数组。(2)、对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他有关数组的操作,哪怕它们乍看上去十一数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。2、对于int calendar[12][31]; 这个语句生命了calendar 阅读全文
posted @ 2012-05-01 09:19 谷堆旁边 阅读(362) 评论(0) 推荐(1)
摘要: 第二章一、知识点1、函数运算符()的优先级高于单目运算符*。(P26)2、我们一旦知道了如何声明一个变量,也就自然知道如何对一个常数进行类型转换,将其转型为该变量的类型:只要在变量声明中将变量名去掉即可。(P27)例如:fp是一个指向返回值为void类型的函数的指针,那么(*fp)()的值为void,fp的声明为:void (*fp)();将常数0转型为“指向返回值为void的函数的指针”类型,可以这样写:(void (*)()) 03、关于操作符优先级:(P30)(1)、优先级最高者并不是真正意义上的运算符,包括:数组下标、函数调用操作符、各结构成员选择操作符。它们都是自左向右结合;(2)、 阅读全文
posted @ 2012-05-01 09:18 谷堆旁边 阅读(300) 评论(0) 推荐(0)
摘要: 第一章一、知识点1、术语“符号”(token)指的是程序的一个基本组成单元。(P15)2、除了字符串与字符常量,符号的中间不能嵌有空白(空格符、制表符、换行符)。例如:下面的表达式:a---b与表达式a -- - b的含义相同,而与a - -- b的含义不同。(P19)3、在C语言中,用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符‘\0’初始化。(P21)4、a+++++b唯一有意义的解释是a++ + ++b,但它也有可能被理解为 阅读全文
posted @ 2012-05-01 09:17 谷堆旁边 阅读(327) 评论(0) 推荐(0)
摘要: 第十一章一、知识点1、面向对象的关键就是把一些数据和对这些数据进行操作的代码组合在一起,并用某种手法将它们做成一个单元。面向对象编程的特点是继承和动态绑定。C++ 通过类的派生支持继承,通过虚拟函数支持动态绑定。虚拟函数提供了一种封装类体系实现细节的方法。(P247)2、面向对象编程的关键概念:(P248)(1)、类:类是一种用户定义类型,就好像是int这样的内置类型一样。内置类型已经有了一套完善的针对它的操作(如算术运算等),类机制也必须允许程序员规定他所定义的类能够进行的操作。类里面的任何东西被称作类的成员。(2)、对象:某个类的一个特定变量,就像j可能是int类型的一个变量一样,对象也可 阅读全文
posted @ 2012-05-01 09:15 谷堆旁边 阅读(337) 评论(0) 推荐(0)
摘要: 第十章一、知识点1、C标准规定%s说明符的参数必须是一个指向字符数组的指针。所以如:char *p = NULL;printf("%s", p);这是不正确的。NULL是一个指针,但它并不指向一个字符数组。(P236)2、在C语言中,数组是静态的,数组的长度在编译时已确定不变:(P237)3、在C语言中实现动态数组:(P239)二、问题1、编写一个main()程序,使用上面提到的那个函数。检查一下原先的数组,并填充足够的元素,使之调用realloc()函数进行扩张。(P241) 阅读全文
posted @ 2012-05-01 00:17 谷堆旁边 阅读(178) 评论(0) 推荐(0)