21天学通C++(第四版)
分类: 图书,计算机/网络,程序设计,C C++ C# VC VC++,
作者: [美]Jesse Liberty
出 版 社: 人民邮电出版社
出版时间: 2002-4-1字数:版次: 1版1次页数: 617印刷时间:开本:印次:纸张:I S B N : 9787115099785包装: 平装编辑推荐
本书全面系统地介绍了C++编程的基本知识,如控制输入/输出、循环和数组、目标编程、模板以及创建C++应用程序,所有这些内容都包括在结构合理、联系紧密的章节之中。本书各章都提供了例程的清单,这些清单包括例程的输出以及代码的分析。此外,为了帮助读者加深理解所学内容,每章结束时都提供了一组常见问题及答案、练习题和测验。通过对照检查附录D所给出的测验和练习题的答案,可评估自己的学习进展情况。
本书可作为没有任何编程经验的新手学习C++的教材,另外由于第四版是这本书的最新版本,所以本书也可作为有经验的C++程序员了解最新编程内容的参考书。
作者简介
Jesse Liberty是编著了12本有关C++,C#及面向对象分析和设计的书籍的作者。他是Liberty Associates(http://WWW.Liberty Associates.com)公司的总裁,该公司提供.net开发、编程、顾问、咨询以及培训。
Jesse曾是一名杰出的AT&T软件工程师,Xerox和LinkNet(PBS)的软件设计师,花旗银行开发部的副总裁。他和他的妻子Stacey及两个女儿Robin和Rachel共同生活在Massachusetts州的Cambridge郊区。
目录
第一篇
第一章开始2
1.1引言2
1.2C++历史简介2
1.2.1本书要解决的问题2
1.2.2过程编程、结构化编程和面向对象的编程3
1.2.3C++和面向对象编程4
1.3C++的发展历程4
1.4学习C++应该先学C吗5
1.5C++和Java及C#5
1.6ANSI标准5
1.7准备编程5
1.8开发环境6
1.9生成程序6
1.9.1用编译器生成对象文件6
1.9.2用链接器生成可执行文件6
1.10程序开发周期7
1.11HELLO.cpp——你的第一个C++程序8
1.12开始学习编译器9
1.12.1创建Hello World项目9
1.13编译错误9
1.14小结10
1.15问与答10
1.16习题10
1.16.1测验11
1.16.2练习11
第二章C++程序的组成部分12
2.1一个简单程序12
2.2cout简介13
2.3使用标准的Namespace15
2.4注释17
2.4.1注释的类型17
2.4.2使用注释17
2.4.3对注释的忠告18
2.5函数18
2.5.1函数的使用19
2.6小结20
2.7问与答20
2.8习题21
2.8.1测验21
2.8.2练习21
第三章变量与常量22
3.1什么是变量22
3.1.1将数据存储在内存中22
3.1.2留出内存22
3.1.3整型量的大小23
3.1.4有符号和无符号24
3.1.5基本变量类型24
3.2定义一个变量25
3.2.1大小写敏感性26
3.2.2关键字26
3.3一次创建多个变量27
3.4给变量赋值27
3.5typedef28
3.6short与long的使用29
3.6.1无符号整型量的回绕29
3.6.2有符号整型量的回绕30
3.7字符型变量31
3.7.1字符和数字31
3.7.2特殊打印字符32
3.8常量32
3.8.1字面常量33
3.8.2符号常量33
3.9枚举型常量34
3.10小结35
3.11问与答36
3.12习题36
3.12.1测验36
3.12.2练习37
第四章表达式和语句38
4.1语句38
4.1.1空白38
4.1.2块和复合语句38
4.2表达式39
4.3运算符40
4.3.1赋值运算符40
4.3.2数学运算符40
4.3.3整型量除法和取模41
4.4赋值运算符与数学运算符的组合41
4.5自加与自减42
4.5.1前置和后置42
4.6优先级44
4.7括号的嵌套44
4.8真值的本质45
4.8.1关系运算符45
4.9if语句46
4.9.1缩进样式48
4.9.2else49
4.9.3高级if语句50
4.10在嵌套的if语句中使用大括号52
4.11逻辑运算符54
4.11.1逻辑“与”54
4.11.2逻辑“或”54
4.11.3逻辑“非”54
4.12简化求值55
4.13关系运算符的优先级55
4.14有关真假关系的进一步讨论55
4.15条件运算符(三目运算符)56
4.16小结57
4.17问与答57
4.18习题58
4.18.1测验58
4.18.2练习58
第五章函数60
5.1什么是函数60
5.2函数的返回值、参数和变元61
5.3声明和定义函数61
5.3.1函数的声明61
5.3.2函数原型61
5.3.3定义函数62
5.4函数的执行63
5.5局部变量63
5.5.1作用范围65
5.6全局变量65
5.7使用全局变量的注意事项66
5.8有关局部变量的更多知识66
5.9函数语句67
5.10有关函数变元的更多知识67
5.10.1使用函数作为函数的参数68
5.11参数作为局部变量68
5.12有关返回值的更多知识69
5.13默认参数71
5.14函数重载72
5.15有关函数的一些专门话题75
5.15.1内嵌函数75
5.15.2递归76
5.16函数是如何工作的80
5.16.1抽象层次80
5.16.2划分RAM80
5.16.3堆栈与函数81
5.17小结82
5.18问与答82
5.19习题83
5.19.1测验83
5.19.2练习83
第六章面向对象编程85
6.1C++是面向对象的吗85
6.2创建新类型85
6.2.1为什么要创建新类型86
6.3类和成员86
6.3.1声明一个类86
6.3.2有关命名习惯的一点说明87
6.3.3定义一个对象87
6.3.4类与对象87
6.4访问类成员87
6.4.1给对象赋值而不是给类赋值88
6.4.2如果你不声明它,你的类就没有它88
6.5私有和公有88
6.5.1使成员数据私有90
6.5.2私有性与安全性91
6.6实现类的方法92
6.7构造函数和析构函数94
6.7.1默认的构造函数和析构函数95
6.7.2使用默认构造函数95
6.8成员函数const97
6.9界面与实现98
6.10在何处放置类声明和方法定义100
6.11内嵌实现100
6.12用其他类作为成员数据的类102
6.13结构体105
6.13.1为什么两个关键字做同一件事106
6.14小结106
6.15问与答106
6.16习题107
6.16.1测验107
6.16.2练习107
第七章程序流程109
7.1循环109
7.1.1循环语句的起源——goto语句109
7.1.2为什么现在不再使用goto语句110
7.2while循环110
7.2.1复杂的while语句111
7.2.2continue和break112
7.2.3while(true)循环114
7.3do...while循环115
7.4do...while116
7.5for循环118
7.5.1高级for循环119
7.5.2多重初始化和自增运算120
7.5.3在for循环中使用空语句120
7.5.4空 for循环122
7.5.5嵌套循环123
7.5.6for循环的作用域124
7.6循环总结125
7.7switch语句126
7.7.1使用带有菜单的switch语句129
7.8小结131
7.9问与答131
7.10习题132
7.10.1测验132
7.10.2练习132
第一篇内容回顾134
第二篇
第八章指针140
8.1什么是指针140
8.1.1在指针中存储地址141
8.1.2指针名142
8.1.3间接引用运算符142
8.1.4指针、地址和变量143
8.1.5使用指针操作数据144
8.1.6检查地址145
8.2为什么要使用指针146
8.3栈和自由存储区(堆)147
8.3.1new147
8.3.2delete148
8.4内存泄漏149
8.5在自由存储区内创建对象150
8.6删除对象150
8.7访问数据成员151
8.8自由存储区中的成员数据152
8.9this 指针155
8.10迷途指针、失控指针或悬浮指针156
8.11const指针158
8.11.1const 指针和const成员函数158
8.11.2const this指针160
8.12指针算法高级主题160
8.13小结162
8.14问与答162
8.15习题163
8.15.1测验163
8.15.2练习163
第九章引用165
9.1什么是引用165
9.2对引用使用取址运算符166
9.2.1引用不能被重新赋值167
9.3什么可以被引用168
9.4空指针和空引用170
9.5通过引用传递函数参数170
9.5.1用指针使swap()工作171
9.5.2使用引用实现swap()172
9.6理解函数头文件和原型1749.7返回多个值174
9.7.1通过引用返回值175
9.8使用引用传递来提高效率177
9.8.1传递const指针179
9.8.2使用引用代替指针181
9.9何时使用引用以及何时使用指针183
9.10混合使用引用和指针183
9.11不要返回对不在作用域中的对象的引用184
9.12返回对一个在堆中的对象的引用185
9.13指针的传递187
9.14小结188
9.15问与答188
9.16习题188
9.16.1测验188
9.16.2练习188
第十章高级函数190
10.1重载成员函数190
10.2使用默认值192
10.3默认值和重载函数的选择194
10.4默认构造函数194
10.5重载构造函数194
10.6初始化对象196
10.7复制构造函数196
10.8运算符重载200
10.8.1写一个自加函数200
10.8.2重载前置运算符201
10.8.3重载运算符函数的返回类型203
10.8.4返回无名临时对象204
10.8.5使用this指针205
10.8.6重载后置运算符206
10.8.7前置和后置之间的区别207
10.8.8加法运算符208
10.8.9重载operator+210
10.8.10运算符重载中存在的问题211
10.8.11运算符重载的局限性211
10.8.12重载什么211
10.8.13赋值运算符212
10.9处理数据类型转换214
10.9.1转换运算符216
10.10小结217
10.11问与答217
10.12习题218
10.12.1测验218
10.12.2练习218
第十一章面向对象的分析及设计220
11.1构造模型220
11.2软件设计:建模语言220
11.3软件设计:过程221
11.4Extreme编程222
11.5概览223
11.6需求分析223
11.6.1使用情况223
11.6.2应用分析230
11.6.3系统分析230
11.6.4计划文档231
11.6.5可视化231
11.6.6人工制品231
11.7设计232
11.7.1什么是类232
11.7.2变换233
11.7.3静态模型234
11.7.4动态模型240
11.8小结242
11.9问与答242
11.10习题243
11.10.1测验243
11.10.2练习243
第十二章继承244
12.1什么是继承244
12.1.1继承和派生244
12.1.2动物世界245
12.1.3派生的语法24512.2私有型与保护型247
12.3构造函数和析构函数248
12.3.1向基构造函数传递参数250
12.4覆盖函数254
12.4.1隐藏基类方法255
12.4.2调用基方法257
12.5虚函数258
12.5.1虚函数是怎样工作的261
12.5.2不能从基类中访问派生类中的函数262
12.5.3切片(slicing)262
12.5.4虚析构函数264
12.5.5虚复制构造函数265
12.5.6虚函数的代价267
12.6小结267
12.7问与答268
12.8习题268
12.8.1测验268
12.8.2练习269
第十三章数组和链表270
13.1什么是数组270
13.2数组元素270
13.3超过数组末尾写入数据271
13.4篱笆标志错误274
13.5初始化数组274
13.6声明数组275
13.7对象的数组276
13.8多维数组277
13.9初始化多维数组278
13.10有关内存的一些话题279
13.11指针数组279
13.12在自由存储区声明数组281
13.13指向数组的指针和指针数组281
13.14指针与数组名281
13.15删除自由存储区中的数组283
13.16char数组283
13.17strcpy()和strncpy()285
13.18字符串类286
13.19链表和其他结构291
13.20链表案例研究292
13.20.1责任授权292
13.21组件部分292
13.22你学到了什么299
13.23数组类299
13.24小结300
13.25问与答300
13.26习题300
13.26.1测验301
13.26.2练习301
第十四章多态性302
14.1单一继承的问题302
14.1.1升迁304
14.1.2下降304
14.1.3添加到两个链表306
14.2多重继承306
14.2.1多重继承对象的构成309
14.2.2多重继承对象中的构造函数309
14.2.3歧义解析312
14.2.4从共享基类中继承312
14.2.5虚继承315
14.2.6多重继承中存在的问题318
14.2.7混合继承和功能类319
14.3抽象数据类型319
14.3.1纯虚函数322
14.3.2实现纯虚函数323
14.3.3复杂的抽象层次326
14.3.4哪些类型是抽象的329
14.4小结329
14.5问与答329
14.6习题330
14.6.1测验330
14.6.2练习330
第二篇内容回顾331
第三篇
第十五章特殊类和函数340
15.1静态成员数据340
15.2静态成员函数344
15.3函数指针346
15.3.1为什么使用函数指针349
15.3.2函数指针数组351
15.3.3把函数指针传递给其他函数353
15.3.4在函数指针中使用typedef356
15.4成员函数指针358
15.4.1成员函数指针数组360
15.5小结361
15.6问与答362
15.7习题362
15.7.1测验362
15.7.2练习362
第十六章高级继承364
16.1包容364
16.1.1访问被包容类的成员369
16.1.2过滤对被包容成员的访问369
16.1.3包容的代价370
16.1.4按值来复制372
16.2按继承/包容条款实现与代理375
16.2.1授权376
16.3私有继承383
16.4友元类390
16.5友元函数397
16.6友元函数和运算符重载397
16.7重载插入运算符401
16.8小结405
16.9问与答405
16.10习题405
16.10.1测验406
16.10.2练习406
第十七章流408
17.1流概述408
17.1.1封装408
17.1.2缓冲409
17.2流和缓冲区410
17.3标准I/O对象410
17.4重定向411
17.5用cin输入411
17.5.1串412
17.5.2串存在的问题413
17.5.3运算符返回对一个istream对象的引用415
17.6cin的其他成员函数415
17.6.1单字符输入415
17.6.2不使用参数的get()415
17.6.3使用带字符引用参数的get()417
17.6.4从标准输入读取字符串417
17.6.5使用cin.ignore()419
17.6.6peek()和putback()421
17.7使用cout输出421
17.7.1清除输出422
17.8相关函数422
17.9控制符、标志和格式化指令423
17.9.1使用cout.width()423
17.9.2设置填充字符424
17.9.3设置标志425
17.10流和printf()函数426
17.11文件的输入和输出429
17.12ofstream429
17.12.1条件状态429
17.12.2打开文件进行输入和输出429
17.12.3在打开时改变ofstream的默认行为430
17.13二进制文件和文本文件432
17.14命令行处理434
17.15小结437
17.16问与答437
17.17习题438
17.17.1测验438
17.17.2练习438
第十八章名字空间439
18.1开始439
18.2按名字解析函数和类439
18.3创建名字空间442
18.3.1声明和定义类型442
18.3.2在名字空间外定义函数443
18.3.3添加新成员443
18.3.4嵌套的名字空间444
18.4使用名字空间444
18.5关键字using446
18.5.1using命令446
18.5.2using声明447
18.6名字空间别名449
18.7未命名的名字空间449
18.8标准名字空间std450
18.9小结451
18.10问与答451
18.11习题452
18.11.1测验452
18.11.2练习452
第十九章模板453
19.1什么是模板453
19.2参数化类型453
19.2.1实例化一个模板的实例453
19.3模板定义454
19.3.1使用名字455
19.3.2模板的实现455
19.4模板函数458
19.5模板和友元459
19.5.1非模板友元类和函数459
19.5.2通用模板友元类或函数462
19.6使用模板项465
19.6.1特殊化函数469
19.6.2静态成员和模板473
19.7标准模板库477
19.8容器477
19.9了解顺序容器477
19.9.1向量容器477
19.9.2列表容器482
19.9.3Deque容器483
19.10堆栈483
19.11了解队列484
19.12了解关联容器484
19.12.1映射容器484
19.12.2其他关联容器487
19.13算法类487
19.13.1不变序列运算488
19.13.2改变序列算法488
19.14小结489
19.15问与答489
19.16习题490
19.16.1测验490
19.16.2练习490
第二十章异常和错误处理492
20.1程序中的各种错误(bugs、errors、mistakes和code rot)492
20.1.1异常492
20.2异常493
20.2.1如何使用异常493
20.3使用try块和catch块497
20.3.1捕捉异常497
20.3.2设置多条catch语句498
20.3.3异常等级500
20.4异常中的数据和命名异常对象502
20.5异常和模板508
20.6没有错误的异常511
20.7关于代码腐烂511
20.8错误和调试511
20.8.1断点512
20.8.2观察点512
20.8.3检查内存512
20.8.4汇编512
20.9小结512
20.10问与答512
20.11习题513
20.11.1测验513
20.11.2练习513
第二十一章进一步掌握的内容515
21.1预处理器和编译器515
21.2查看中间结果515
21.3使用#define515
21.3.1用#define替换常量516
21.3.2用#define进行测试516
21.3.3预编译命令#else516
21.4包含和包含警卫517
21.5宏函数518
21.5.1为什么总要用括号519
21.5.2宏与函数和模板520
21.6内联函数520
21.7字符串操作522
21.7.1字符串化522
21.7.2连结字符串522
21.8预定义宏523
21.9assert()523
21.9.1用assert()调试524
21.9.2assert()与异常524
21.9.3副作用525
21.9.4类不变量525
21.9.5打印中间值529
21.9.6调试级别530
21.10位操作535
21.10.1“与”运算符536
21.10.2“或”运算符536
21.10.3“异或”运算符536
21.10.4求补运算符536
21.10.5设置位536
21.10.6清除位536
21.10.7反转位537
21.10.8位字段537
21.11风格539
21.11.1缩进540
21.11.2大括号540
21.11.3长代码行540
21.11.4switch语句540
21.11.5程序文本540
21.11.6标识符名称541
21.11.7名字的拼写和大写541
21.11.8注释542
21.11.9访问542
21.11.10类定义542
21.11.11包含文件542
21.11.12assert()543
21.11.13const543
21.12下一步543
21.12.1从何处获得帮助和建议543
21.12.2学习C#543
21.12.3保持联系543
21.13小结544
21.14问与答544
21.15习题545
21.15.1测验545
21.15.2练习545
第三篇内容回顾546
附录A二进制和十六进制557
A.1其他进制557
A.2进制的转换558
A.2.1二进制559
A.2.2为什么用二进制559
A.2.3位、字节和半字节560
A.2.4什么是kB(千字节)560
A.2.5二进制数560
A.3十六进制560
附录BC++关键字564
附录C运算符的优先级565
附录D答案566