图书介绍

C/C++实践进阶之道 写给程序员看的编程书2025|PDF|Epub|mobi|kindle电子书版本百度云盘下载

C/C++实践进阶之道 写给程序员看的编程书
  • 陈黎娟编著 著
  • 出版社: 北京:中国铁道出版社
  • ISBN:9787113237585
  • 出版时间:2018
  • 标注页数:452页
  • 文件大小:65MB
  • 文件页数:478页
  • 主题词:C语言-程序设计;C++语言-程序设计

PDF下载


点此进入-本书在线PDF格式电子书下载【推荐-云解压-方便快捷】直接下载PDF格式图书。移动端-PC端通用
种子下载[BT下载速度快]温馨提示:(请使用BT下载软件FDM进行下载)软件下载地址页直链下载[便捷但速度慢]  [在线试读本书]   [在线获取解压码]

下载说明

C/C++实践进阶之道 写给程序员看的编程书PDF格式电子书版下载

下载的文件为RAR压缩包。需要使用解压软件进行解压得到PDF格式图书。

建议使用BT下载工具Free Download Manager进行下载,简称FDM(免费,没有广告,支持多平台)。本站资源全部打包为BT种子。所以需要使用专业的BT下载软件进行下载。如BitComet qBittorrent uTorrent等BT下载工具。迅雷目前由于本站不是热门资源。不推荐使用!后期资源热门了。安装了迅雷也可以迅雷进行下载!

(文件页数 要大于 标注页数,上中下等多册电子书除外)

注意:本站所有压缩包均有解压码: 点击下载压缩包解压工具

图书目录

第1篇 夯实C语言核心基础2

第1章 Hello, C语言2

1-1闭上眼睛细数C语言的特点2

C语言精巧2

支持结构化程序编写模型2

变量和语句是C语言的细胞3

数学运算和逻辑表达式是C语言的第一个难点3

函数是C语言赐给我们最有力的武器3

数组是我们第一次学习组织数据4

指针是C语言的精华,但它是魔鬼发明的4

struct是我们临摹世界的画板4

掌握基本概念的组合才是成为C语言高手的必经之路4

字符串是指针确认的5

位运算是C语言底层开发的特色5

预处理命令是程序开发的脚手架5

文件是一个序列5

1-2从基本概念开始6

1-3掌握C语言核心,逐步扩张8

1-4 C++时代的C语言学习11

1-5 C++:更好的C12

新的注释模式13

新的输入/输出方法13

const的新功能13

变量的定义更加灵活13

函数的重载13

带默认参数的函数13

变量的引用类型13

新的内存分配函数new和delete14

内嵌(inline)函数14

作用域运算符14

第2章 建立起程序设计基本概念15

2-1软件与程序15

2-2程序与可执行文件16

2-3程序与源程序17

2-4源程序与程序设计语言18

2-5程序设计的基本过程19

2-6文件和目录19

2-7理解编码上机调试和步骤22

2-8 C/C++程序员成长经验23

第一阶段:C语言的学习23

第二阶段:课程设计和毕业设计24

第三阶段:硬件开发和学习C++25

第四阶段:中型项目开发经验25

第五阶段:大型项目开发经验25

总结个人学习成长的道路25

因材施教:使用两套教材26

第3章 在Visual C++中验证C程序27

3-1选择Visual C++的三个理由27

3-2调试程序的五个步骤28

3-3编写Console应用32

3-4跨过调试程序的最初障碍35

语法错误(Syntax Error)38

语义错误(Semantic Error)38

运行错误(BUG)39

3-5 Visual C++简易使用参考40

新建文档40

打开文档41

查看文档42

保存文档44

在打开的文档中搜索文本45

在已打开的文档中替换文本45

在磁盘文件中搜索文本46

常规表达式搜索46

3-6从Turbo C到Borland C++47

3-7理解函数库和头文件48

第4章 代码基本逻辑:顺序、选择和循环51

4-1流程图51

4-2顺序结构52

【示例4-1】输入三角形的三边长,求三角形面积52

4-3选择结构52

4-3-1 if语句52

【示例4-2】 if语句的基本用法(输入数值,如果大于0,输出“正数”)53

【示例4-3】利用if-else语句对数值进行正负的判断54

4-3-2 switch语句54

【示例4-4】利用switch判断用户输入的日期是星期几55

【示例4-5】判断输入的日期是星期几(使用break语句)56

【示例4-6】利用if语句根据成绩范围给出等级56

4-4循环结构57

4-4-1利用goto语句和if语句构成循环57

【示例4-7】计算1+2+3+…+100的值57

4-4-2 while语句58

【示例4-8】利用while循环语句计算1+2+3+…+100的值58

4-4-3 do-while语句58

【示例4-9】利用do-while循环语句来计算1+2+3+…+100的值59

4-4-4 for语句59

【示例4-10】小高斯的for循环语句实现方法。60

【示例4-11】小高斯的for循环语句实现方法之二(省略表达式2的应用举例)60

【示例4-12】小高斯的for循环语句实现方法之三(省略表达式3的应用举例)60

【示例4-13】小高斯的for循环语句实现方法之四(省略表达式1和表达式3的应用举例)61

【示例4-14】当需要无限循环时,for循环语句表达式全部被省略的应用举例61

【示例4-15】小高斯的for循环实现方法之五(for语句中的逗号表达式)61

【示例4-16】读懂奇怪的for循环(for循环语句中的表达式2为特殊表达式时)61

【示例4-17】利用while循环求满足n2-15n-36 > 0的最小整数62

4-4-5 break语句63

【示例4-18】演示break语句的应用:计算1+2+3+…+100的值63

4-4-6 continue语句63

【示例4-19】演示continue语句的应用:计算1到100的偶数之和63

4-5本章综合实例64

4-5-1综合实例1:求某整数段区间中的素数,并输出64

4-5-2综合实例2:根据用户输入的年份判断年份是否为闰年66

第5章 加强对函数的理解67

5-1函数的引入67

【示例5-1】求从1加到100的值67

【示例5-2】求从1加到n的值68

【示例5-3】求从1加到n的值(高斯算法)69

5-2函数的基本概念69

5-3库函数70

5-4函数的嵌套调用71

【示例5-4】在max3函数中实现嵌套调用71

5-5代码封装:模块化程序设计的起步71

5-6接口/实现思想的第一次体现72

5-7总结一下:函数帮你编写更好的代码72

5-8对比Pascal语言和C语言中函数使用的差异74

第6章 总结:快速掌握C语言基础知识76

6-1再次Understand C76

6-2把基础知识串起来77

6-3综合实例1:打印Fibonacci数列78

6-4综合实例2:把Fibonacci数列中的素数找出来79

6-5综合案例3:在Fibonacci数列中加入数组的应用80

6-6最后的综合性代码81

6-7成为C程序员你还需要知道的事情82

6-8三小时你可以学会FORTRAN85

第2篇 提升你的编程功力88

第7章 逐步写出大程序88

7-1准备案例1:闰年的判断88

7-2准备案例2:这一天是星期几89

7-3更高要求:万年历的编写91

7-4再完善一下:打印某年日历94

7-5总结与思考:程序成长与模块化96

第8章 自己动手编写小工具97

8-1 DIR命令今犹在97

8-2 DOS版DIR命令98

8-3 Windows版本的DIR100

8-4工具编写总结和练习103

8-5继续学习和提高104

第9章 学会组织自己的代码105

9-1解决问题的基本方法和C程序的基本结构105

9-2用Project管理自己的代码108

9-3为自己的代码扩充功能110

9-4养成一些编码的好习惯111

第10章 读源代码,逐步体会算法的力量116

10-1读函数源代码,学技巧116

10-2体会算法的力量118

【示例10-1】判断一个自然数n是否是素数119

10-3算法的三重境界121

【示例10-2】写一个函数计算当参数为n (n很大)时的值1-2+3-4+5-6+7-…+n121

【示例10-3】在一个很小的内存空间中,将北京某电话局的8位电话号码排序。号码在10000个以内122

10-4那些C语言必须调试的陷阱123

第3篇 积累专业程序员的开发经验126

第11章 烦琐但很重要的变量和类型126

11-1计算机是如何存储变量的126

11-2确保每个对象在使用前已被初始化131

11-3局部变量和全局变量的差别133

11-3-1首先理解函数中的局部变量134

11-3-2其次理解函数外的全局变量135

11-3-3掌握变量在内存中的存储方式136

11-4掌握变量定义的位置与时机138

11-5引用难道只是别人的替身140

第12章 理解数组和指针143

12-1理解指针的本质143

12-1-1指针变量和变量的指针143

12-1-2空指针和void指针145

12-1-3 const修饰指针146

12-2论数组和指针的等价性147

12-3再论数组和指针的差异性149

12-3-1字符串数组与字符指针的区别149

12-3-2当编译器强行把指针和数组混合151

12-4充满疑惑的数组指针和指针数组152

第13章 常见更要谨慎的字符和字符串155

13-1关于字符编码的讨论155

13-2请牢记字符串结束标志为‘’157

13-3请务必小心使用memcpy()系列函数159

【示例13-1】 POD对象的复制160

13-4正确使用字符串处理函数161

第14章 表达式和语句中的陷阱164

14-1运算符引发的混乱164

14-2表达式求值顺序不要想当然167

14-3 switch-case语句的陷阱170

14-3-1正确使用break语句171

14-3-2 case标号和default标号的正确使用173

14-4 a || b和a&&b的陷阱174

14-4-1 陷阱一:短路求值175

【示例14-1】没想清逻辑,代码死循环175

14-4-2陷阱二:逻辑运算混淆使用176

14-5“悬挂”else引起的问题177

第15章 函数的秘密180

15-1禁止函数返回局部变量的引用180

15-2函数传值、传指针及传引用的效率分析183

15-3内联函数会像宏一样替换吗188

15-4函数重载需考虑什么191

15-4-1准确理解函数重载191

【示例15-1】实现一个打印函数,既可打印int类型,也可打印string类型191

15-4-2为什么引入函数重载192

15-4-3如何处理函数重载192

15-5不要让main返回void195

15-5-1理解main函数的定义形式195

15-5-2 main函数的返回值作用196

15-5-3 void main()形式函数的风险隐患197

15-5-4“好坏难定”的准则197

15-6尽量拒绝使用变参函数198

【示例15-2】实现一个支持std::string的printf199

15-7为何降低函数的圈复杂度202

15-7-1提炼函数的方法203

15-7-2以明确函数取代参数204

第16章 正确使用预处理206

16-1使用#define定义字面值和伪函数206

16-1-1简单宏定义(字面值)206

16-1-2 #define和const定义的恒值常量对比207

16-1-3带参数的宏定义(伪函数)208

16-1-4带参数的宏和函数的区别208

16-1-5引入宏的优点209

16-1-6宏定义和命名空间的关系209

16-2 #define的使用陷阱210

16-2-1由操作符优先级引起的问题210

16-2-2使用宏定义,不允许参数发生变化211

16-2-3使用do{}while (false)将宏定义包含的多条表达式放到大括号中211

16-2-4关于...的使用212

16-2-5消除多余的分号213

16-3防止重复包含头文件214

【示例16-1】头文件重复包含bug214

16-3-1解决方案之一:#ifndef方式215

16-3-2解决方案之二:#pragma once215

16-3-3 #pragma once与#ifndef的区别216

16-4 assert的副作用216

【示例16-2】断言出现bug217

16-5多学一点,关于#和##的讨论219

16-5-1#让字符串巧妙用在宏定义中219

16-5-2##让宏定义像函数一样输入参数220

16-5-3#与##使用的陷阱221

第17章 非绝对禁止者,皆可使用222

17-1表示语句结束的分号的思考222

17-2 goto语句真的一无是处吗224

17-2-1观点一:goto语句是有害的225

【示例17-1】使用goto语句执行数组元素的交换顺序225

17-2-2观点二:某些情况下支持使用goto语句226

17-3条件操作符和逗号操作符229

17-3-1理解条件操作符并用好它229

17-3-2让逗号操作符派上用场230

17-4和魔鬼数字说再见230

17-4-1魔鬼数字带来的麻烦230

17-4-2给魔鬼数字起一个名字231

17-5关于循环语句的变化232

17-5-1新旧标准中for语句的变化232

17-5-2巧用do循环宏定义233

17-5-3循环语句的效率234

第18章 程序员应该知道的指针技术236

18-1深刻理解void和void236

18-2防微杜渐,拒绝野指针239

18-2-1野指针产生的原因240

18-2-2预防野指针的策略241

18-3“臭名昭著”的空指针到底是什么242

18-3-1怎样在程序中获得一个空指针243

18-3-2使用“if (p)”检查空指针是否可靠243

18-3-3 NULL是什么,它是如何定义的244

18-3-4如果 NULL和0作为空指针常数是等价的,到底该用哪一个244

18-3-5 NULL可以确保是0,但空指针却不一定245

18-3-6利用空指针(NULL),提高程序运行效率245

18-4多维数组和指针245

【示例18-1】二维数组元素的遍历(两种多维数组声明方式的比较)248

18-5引用和指针的差异249

18-5-1相同点:都是地址概念且可实现继承类的动态绑定250

18-5-2不同点:五方面差异一一道来251

第19章 C++新增关键字中的关键254

19-1尽可能多地使用const254

19-1-1函数声明使用const255

19-1-2函数返回值声明为const255

19-1-3 const成员函数256

【示例19-1】字符串输出次数统计(const成员函数)256

19-1-4 尽量用const常量替换#define常量定义257

19-2 volatile和mutable用在何处258

19-3尽量用new/delete替代malloc/free263

19-3-1谈谈二者的区别263

【示例19-2】增加new/delete的意义263

19-3-2 New运算符的三种形式分析265

19-4使用new/delete时要采用相同形式267

【示例19-3】 C++中的内存管理(申请的资源放到同一个类中进行管理)268

19-5 sizeof和对象的大小270

19-5-1讲讲sizeof的用法271

19-5-2标准数据类型的sizeof271

19-6谨慎使用static276

19-6-1 static使用方式之静态局部变量276

19-6-2 static使用方式之静态全局变量/函数277

【示例19-4】就算你用了extern, static也禁止你使用278

19-6-3 static使用方式之静态成员变量/函数278

【示例19-5】 static让类成员变得独一无二278

第20章 专业程序员也经常犯的错281

20-1枚举和一组预处理的#define有何不同281

20-2为何struct xl{ struct xl stX };无法通过编译284

【示例20-1】 CA、CB两个类相互包含引用问题(无法通过编译)285

【示例20-2】 CA、CB两个类相互包含引用问题(前向声明实现)286

【示例20-3】 CA、CB两个类相互包含引用问题(friend声明实现)286

20-3实现可变数组struct{int namelen; char namestr[l];};287

20-4 rypedef使用的陷阱290

20-4-1 typedef和宏混用陷阱290

20-4-2 typedef新规和简化技巧292

20-4-3类回调函数的实现293

【示例20-4】隧道CTunnel类回调函数的声明和实现293

20-5优化结构体中元素的布局294

20-5-1内存对齐295

20-5-2 progma pack()宏对齐297

20-6既有结构,为何引入联合298

20-6-1结构体与联合体的差异298

20-6-2联合体的经典应用场景300

20-7提防隐式转换带来的麻烦301

20-7-1隐式转换发生的几种情况301

20-7-2一个不经意的隐式转换陷阱304

20-8如何判定变量是否相等305

第4篇 C++和类——面向对象的世界观312

第21章 从精通C到学习C++312

21-1我们为什么要学习C++312

21-2故事:教C语言高手学C++313

21-2-1第一幕:用C++,程序会简单得多313

21-2-2第二幕:类就是封装315

21-2-3第三幕:用另外一个视角看类316

21-2-4第四幕:成长日志319

21-3拾级而上,成为C++高手319

第22章 面向对象设计思想和类321

22-1思路决定代码,程序设计思想321

22-1-1机器逻辑化编程思路:结构化程序设计321

22-1-2模拟现实世界的思路:面向对象程序设计322

22-2类,对现实世界抽象323

22-2-1类的定义和组成323

【示例22-1】定义一个手机的类324

【示例22-2】手机类数据成员的声明324

【示例22-3】手机类数据成员的类型325

【示例22-4】定义一个手机的类,包括一个显示手机名、型号、尺寸的成员函数326

22-2-2类成员的访问控制326

【示例22-5】类成员的访问控制属性327

【示例22-6】定义一个手机的类:实现显示手机名、型号、尺寸的功能328

22-2-3类实例和类成员访问328

【示例22-7】声明一个描述IPhone X手机的实例指针并为其赋值329

【示例22-8】编写一个手机的类,实现设置和显示手机名、型号、尺寸的功能,并声明一个针对IPhone X型号手机的实例,实现设置和显示机器名、型号、尺寸的功能330

22-2-4类的作用域和对象的生存周期331

【示例22-9】手机类的作用域331

22-2-5 this指针332

【示例22-10】利用this指针访问手机类中的数据成员332

22-2-6静态成员333

【示例22-11】定义一个手机短信息的类333

【示例22-12】编写一个手机短信息类,要求能够统计短信息总数的功能333

【示例22-13】编写一个手机短信息类,利用静态成员函数取得短信息总数336

【示例22-14】类的静态成员访问337

22-2-7常成员337

【示例22-15】编写一个手机短信息类,定义一个用于表示信息最大长度的常数据成员337

【示例22-16】编写一个手机类,定义用于显示手机基本信息的常成员函数339

22-3构造函数和析构函数340

22-3-1构造函数340

【示例22-17】编写一个手机类,定义其构造函数,对手机基本信息进行初始化340

【示例22-18】编写一个手机类,定义其构造函数,采用带有参数的构造函数对手机基本信息进行初始化342

【示例22-19】定义一个描述IPhone X手机的类,构造函数带有默认的参数343

22-3-2复制构造函数344

【示例22-20】编写一个手机类,定义其复制构造函数,实现对实例的复制344

【示例22-21】类的复制构造函数举例(当函数的形参是类的实例时)345

【示例22-22】类的复制构造函数举例(当函数的返回值为类的实例时)345

22-3-3默认复制构造函数346

【示例22-23】编写一个手机类,利用默认复制构造函数,实现对实例的复制346

22-3-4浅复制和深复制347

【示例22-24】编写一个手机类,利用开辟堆内存的方式来存储手机名;利用默认复制构造函数,实现对实例的复制348

【示例22-25】编写一个手机类,利用开辟堆内存的方式来存储手机名;利用自定义复制构造函数,实现对实例的复制349

22-3-5析构函数351

【示例22-26】编写一个手机类,利用开辟堆内存的方式来存储手机名;利用析构函数对实例进行析构351

22-4类的组合352

22-4-1类的组合的概念352

【示例22-27】手机组合类的定义352

【示例22-28】学生组合类的定义353

22-4-2组合类的构造函数和析构函数353

【示例22-29】学生组合类的构造函数和析构函数的调用顺序353

22-4-3组合类的初始化355

【示例22-30】定义一个面上的线段类,能够计算线段的长度355

22-5综合实例:定义员工类,实现员工信息的存储和输出356

22-6万事万物皆对象359

第 23章 重载完善类方法361

23-1让函数适应不同类型数据,适应多参数361

23-1-1合并相同功能的函数,重载函数的定义361

【示例23-1】利用重载定义求绝对值的函数362

23-1-2重载函数的匹配有原则362

23-2让你的代码更加直观,运算符重载363

23-2-1当操作自定义数据时,考虑运算符重载363

【示例23-2】定义一个复数类363

【示例23-3】复数类的加法运算364

23-2-2重载的是已经定义的运算符364

【示例23-4】利用运算符重载来实现复数的加减运算(运算符作为成员函数)366

【示例23-5】利用运算符重载来实现复数的加减运算(运算符作为友元函数)367

23-2-3让代码看起来像C++自带的语法368

【示例23-6】利用运算符重载实现复数类的增量运算368

【示例23-7】利用友元函数来实现重载370

23-2-4转换运算符重载的技巧370

【示例23-8】重载强制转换符实现将复数转化为实数371

【示例23-9】运算符重载的二义性问题372

23-2-5赋值运算符也能重载372

【示例23-10】定义一个描述手机的短信息类,重载赋值运算符373

23-3重载让C++更自然373

【示例23-11】定义一个自定义字符类,进行下标运算符重载373

第24章 类的继承376

24-1像生物一样进化:继承与派生376

24-1-1继承与派生的概念376

24-1-2代码的进化,派生类的声明377

【示例24-1】研究生类可以通过继承学生类来定义378

24-1-3类的成长,生成派生类的步骤378

【示例24-2】通过继承学生类来实现研究生类379

24-2类的隐藏与接口,继承中的访问控制381

24-2-1公有继承的访问控制381

【示例24-3】已经存在一个点类(Point类),表示几何上的“点”,通过继承点类来定义一个线段(Linesegmen)类(通过公有继承进行实现)381

24-2-2私有继承的访问控制383

【示例24-4】已经存在一个点类(Point类),表示几何上的“点”通过继承点类来定义一个线段(Linesegment类)(通过私有继承进行实现)383

24-2-3保护继承的访问控制384

【示例24-5】已经存在一个点类(Point类),表示几何上的“点”,通过继承点类来定义一个线段(Linesegment类)(通过保护继承进行实现)385

24-3派生类的构造函数和析构函数386

24-3-1派生类的构造函数386

【示例24-6】通过继承学生类来实现研究生类,定义研究生类的构造函数,对基类成员和派生类成员进行初始化387

24-3-2派生类的析构函数390

【示例24-7】多继承并含有内嵌实例的类的析构函数的工作390

24-4基类与派生类的相互作用391

24-4-1派生类成员的标识和访问391

【示例24-8】多继承并含有相同类成员方法的析构函数的工作392

【示例24-9】作用域分辨符的嵌套用的错误393

24-4-2基类和派生类赋值规则394

【示例24-10】基类和派生类实例的赋值规则演示395

24-5不抽烟,不喝酒,乞丐和好男人的属性居然一模一样395

【综合实例24-1】编写一个操作日期(年、月、日)和时间(时、分、秒)的程序395

【综合实例24-2】定义在职研究生类,通过虚基类来描述397

第25章 虚函数产生多态性403

25-1巧妙适应多种情况,C++的多态性403

25-1-1多态的概念和类型403

25-1-2多态的实现方式404

25-2虚函数404

25-2-1虚函数的概念和定义404

【示例25-1】在学生类与研究生类继承的代码基础上增加计算学生费用的函数(虚函数实现)404

【示例25-2】利用多态性来实现学生类的学费计算407

25-2-2虚函数的使用规则410

25-3纯虚函数与抽象类410

25-3-1纯虚函数410

25-3-2抽象类和抽象基类411

【示例25-3】抽象类的定义和使用:定义一个抽象类,在其派生类中实现虚函数接口display()411

25-4综合实例:按设定规则输出某企业各类员工的人员姓名与相应薪水412

25-5面向对象还是面向过程419

第5篇 以C++为母语424

第26章 网络工具Ping的功能实现424

26-1 Windows下命令行:Ping命令424

26-2网络数据翻译官:Wireshark数据包分析426

26-3沟通的艺术:Ping实现原理分析428

26-3-1互联网通信原理428

26-3-2网际控制报文协议介绍429

26-4利用系统API: Windows网络编程技术429

26-5编程模拟实现Ping命令433

26-5-1先梳理程序设计思路433

26-5-2整体的执行流程433

26-5-3关键代码的解析435

26-6总结和建议读者的练习442

第27章 C#探索之旅443

27-1组件,还是组件443

27-2 C#版本的microEditor443

27-2-1启动Visual C#熟悉基本界面444

27-2-2寻找Editor组件445

27-2-3给应用程序添加菜单功能446

27-2-4调用标准对话框447

27-2-5别让右键空白448

27-3前事不忘,后事之师:有经验的程序员也可能做错448

27-4解析C#应用程序结构449

27-4-1 using namespace449

27-4-2 class、Main还有Application449

27-5小结:WinFonns组件库使用心得450

27-6练习:为microEditor添加新功能451

27-7我一直想弄明白的几个问题451

27-8思考:如何快速掌握C#452

热门推荐