登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 聯絡我們  | 運費計算  | 幫助中心 |  加入書簽
會員登入 新註冊 | 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類閱讀雜誌 香港/國際用戶
最新/最熱/最齊全的簡體書網 品種:超過100萬種書,正品正价,放心網購,悭钱省心 送貨:速遞 / EMS,時效:出貨後2-3日

2024年03月出版新書

2024年02月出版新書

2024年01月出版新書

2023年12月出版新書

2023年11月出版新書

2023年10月出版新書

2023年09月出版新書

2023年08月出版新書

2023年07月出版新書

2023年06月出版新書

2023年05月出版新書

2023年04月出版新書

2023年03月出版新書

2023年02月出版新書

『簡體書』深度探索C++14

書城自編碼: 3522192
分類: 簡體書→大陸圖書→計算機/網絡程序設計
作者: [德]Peter,Gottschling[彼得·哥特史林]
國際書號(ISBN): 9787121354984
出版社: 电子工业出版社
出版日期: 2020-07-01

頁數/字數: /
書度/開本: 16开 釘裝: 平装

售價:NT$ 768

我要買

share:

** 我創建的書架 **
未登入.



新書推薦:
她的罪名
《 她的罪名 》

售價:NT$ 279.0
巨变与突围:碰撞中的清帝国:1644—1840
《 巨变与突围:碰撞中的清帝国:1644—1840 》

售價:NT$ 437.0
变态心理揭秘
《 变态心理揭秘 》

售價:NT$ 279.0
非洲三万里(2024版)
《 非洲三万里(2024版) 》

售價:NT$ 381.0
不思而美:一个人的心灵简史
《 不思而美:一个人的心灵简史 》

售價:NT$ 325.0
减压七处方
《 减压七处方 》

售價:NT$ 314.0
成为作家
《 成为作家 》

售價:NT$ 269.0
工作文化史 古代卷
《 工作文化史 古代卷 》

售價:NT$ 381.0

建議一齊購買:

+

NT$ 624
《 C++17入门经典(第5版) 》
+

NT$ 644
《 Effective Modern C++中文版 》
+

NT$ 709
《 C C++代码调试的艺术 》
+

NT$ 534
《 More Effective C++:35个改善编程与设计的有效方法(中文版) 》
+

NT$ 708
《 Boost程序库完全开发指南――深入C++”准”标准库(第5版) 》
+

NT$ 407
《 程序员思维修炼(修订版) 》
編輯推薦:
如今科学工程项目越来越大、越来越复杂,许多项目都采用C 来完成。同时,随着嵌入式硬件的日益强大,嵌入式软件编程语言也转向C 。从嵌入式硬件到高级编程抽象,C 几乎支持每个层级的编程。总而言之,C 是一门每一个技术人员都需要了解的语言。
本书深入介绍了基于C 高级功能的复杂方法。作者选用了多个不同领域的案例,同时结合了向物理学、数学和工程学等专业学生教授C 的丰富经验,来介绍C 中的关键概念。
本书旨在帮助你快速入门,也会让你掌握从lambda表达式到模板表达式的诸多高阶功能。 你还将学习如何使用C 强大的程序库:标准模板库(STL)和用于算法、线性代数、微分方程、图形的科学类库。
作者演示了如何使用面向对象、泛型、元编程和过程式编程来编写清晰明了、直观练达的软件。当你学完本书,你将掌握如何使用C 来编写高质量、高性能的软件。
內容簡介:
本书从传统的Hello World开始,先介绍了语言入门C 所必须的基本要素(如表达式、语句、声明);再到和程序组织有关的函数、类;然后深入探讨了C 所支持的泛型编程、元编程和面向对象等不同编程范式,并且提供了很多的例子可以让读者仔细体会它们之间的联系、区别和适用场景;*后再以一个中型项目为例介绍了一些大型工程所必备的基础知识。本书适合C 初学者、正在开发和维护科学和工程软件的软件工程师,以及希望学习和理解现代C 机制如泛型编程和元编程的读者。
關於作者:
Peter Gottschling 热衷于编写前沿的科学计算软件,他希望他的热情也能感染读者。因为职业的缘故他编写了MTL4(矩阵模板库4),同时也是Boost Graph Library 的作者之一。他曾在多个C 课程和专业培训中分享过开发经验,并撰写了本书。
译者吴野,线上常用ID空明流转。毕业后在数家IT企业工作过,拥有数年软件开发和硬件设计经验。C 为其常用编程语言之一,业余时间也会阅读一些C 标准和标准提案。
目錄
第1章 C 基础(C Basics) 1
1.1 第一个程序(Our First Program) 1
1.2 变量(Variables) 4
1.2.1 常量(Constants) 7
1.2.2 字面量(Literals) 7
1.2.3 非窄化的初始化(non-narrowing initialization) 9
1.2.4 作用域(Scopes) 11
1.3 操作符(Operators) 13
1.3.1 算术操作符(Arithmetic Operators) 14
1.3.2 布尔操作符(Boolean Operators) 17
1.3.3 位操作符(Bitwise Operators) 18
1.3.4 赋值(Assignment) 19
1.3.5 程序流(Program Flow) 19
1.3.6 内存处理(Memory Handling) 20
1.3.7 访问操作符(Access Operators) 21
1.3.8 类型处理(Type Handling) 21
1.3.9 错误处理(Error Handling) 21
1.3.10 重载(Overloading) 22
1.3.11 操作符优先级(Operator Precedence) 22
1.3.12 避免副作用(Avoid Side Effects!) 22
1.4 表达式和语句(Expressions and Statements) 25
1.4.1 表达式(Expressions) 25
1.4.2 语句(Statements) 26
1.4.3 分支(Branching) 27
1.4.4 循环(Loops) 29
1.4.5 goto 33
1.5 函数(Functions) 33
1.5.1 参数(Arguments) 34
1.5.2 返回结果(Returning Results) 36
1.5.3 内联(Inlining) 37
1.5.4 重载(Overloading) 38
1.5.5 main函数(main Function) 40
1.6 错误处理(Error Handling) 41
1.6.1 断言(Assertions) 41
1.6.2 异常(Exceptions) 43
1.6.3 静态断言(Static Assertions) 48
1.7 IO 48
1.7.1 标准输出(Standard Output) 48
1.7.2 标准输入(Standard Input) 49
1.7.3 文件的输入和输出(InputOutput with Files) 49
1.7.4 泛化的流概念(Generic Stream Concept) 50
1.7.5 格式化(Formatting) 51
1.7.6 处理输入输出错误(Dealing with IO Errors) 53
1.8 数组、指针和引用(Arrays, Pointers, and References) 56
1.8.1 数组(Arrays) 56
1.8.2 指针(Pointers) 58
1.8.3 智能指针(Smart Pointers) 62
1.8.4 引用(References) 65
1.8.5 指针和引用的比较(Comparison between Pointers and References) 66
1.8.6 不要引用过期数据(Do Not Refer to Outdated Data!) 67
1.8.7 数组的容器(Containers for Arrays) 67
1.9 软件项目结构化(Structuring Software Projects) 70
1.9.1 注释(Comments) 70
1.9.2 预编译指示字(Preprocessor Directives) 71
1.10 练习(Exercises) 75
1.10.1 年龄(Age) 75
1.10.2 数组和指针(Arrays and Pointers) 76
1.10.3 读取一个矩阵市场文件的头部(Read the Header of a Matrix
Market File) 76
第2章 类(Classes) 77
2.1 为普遍意义而不是技术细节编程(Program for Universal Meaning Not for
Technical Details) 77
2.2 成员(Members) 79
2.2.1 成员变量(Member Variables) 80
2.2.2 可访问性(Accessibility) 80
2.2.3 访问操作符(Access Operators) 83
2.2.4 类的静态声明符(The Static Declarator for Classes 84
2.2.5 成员函数(Member Functions) 84
2.3 设置值:构造函数和赋值(Setting Values: Constructors and Assignments) 85
2.3.1 构造函数(Constructors) 86
2.3.2 赋值(Assignment) 96
2.3.3 初始化器列表(Initializer Lists) 97
2.3.4 一致性初始化(Uniform Initialization) 99
2.3.5 移动语义(Move Semantic) 101
2.4 析构函数(Destructors) 105
2.4.1 实现准则(Implementation Rules) 105
2.4.2 适当处理资源(Dealing with Resources Properly) 106
2.5 自动生成方法清单(Method Generation Rsum) 112
2.6 成员变量访问(Accessing Member Variables) 113
2.6.1 访问函数(Access Functions) 113
2.6.2 下标操作符(Subscript Operator) 115
2.6.3 常量成员函数(Constant Member Functions) 116
2.6.4 引用限定的变量(Reference-Qualified Members) 117
2.7 操作符重载的设计(Operator Overloading Design) 118
2.7.1 保持一致!(Be Consistent!) 119
2.7.2 注意优先级(Respect the Priority) 120
2.7.3 成员函数和自由函数(Member or Free Function) 120
2.8 练习(Exercises) 123
2.8.1 多项式(Polynomial) 123
2.8.2 移动赋值(Move Assignment) 123
2.8.3 初始化器列表(Initializer List) 123
2.8.4 资源管理(Resource Rescue) 124
第3章 泛型编程(Generic Programming) 125
3.1 函数模板(Function Templates) 125
3.1.1 实例化(Instantiation) 127
3.1.2 参数类型的推导(Parameter Type Deduction) 128
3.1.3 在模板中处理错误(Dealing with Errors in Templates) 132
3.1.4 混合类型(Mixing Types) 133
3.1.5 一致性初始化(Uniform Initialization) 134
3.1.6 自动返回值类型(Automatic return Type) 134
3.2 命名空间与函数查找(Namespaces and Function Lookup) 135
3.2.1 命名空间(Namespaces) 135
3.2.2 参数相关查找(Argument-Dependent Lookup) 138
3.2.3 命名空间限定还是ADL(Namespace Qualification or ADL) 142
3.3 类模板(Class Templates) 144
3.3.1 一个容器的范例(A Container Example) 144
3.3.2 为类和函数设计统一的接口(Designing Uniform Class and
Function Interfaces) 146
3.4 类型推导与定义(Type Deduction and Definition) 153
3.4.1 自动变量类型(Automatic Variable Type) 153
3.4.2 表达式的类型(Type of an Expression) 154
3.4.3 decltypeauto 155
3.4.4 定义类型(Defining Types) 156
3.5 关于模板的一点点理论:概念(A Bit of Theory on Templates: Concepts) 158
3.6 模板特化(Template Specialization) 159
3.6.1 为单个类型特化类(Specializing a Class for One Type) 159
3.6.2 函数特化和重载(Specializing and Overloading Functions) 162
3.6.3 部分特化(Partial Specialization) 164
3.6.4 函数的部分特化(Partially Specializing Functions) 165
3.7 模板的非类型参数(Non-Type Parameters for Templates) 168
3.8 仿函数(Functors) 170
3.8.1 类似函数的参数(Function-like Parameters) 172
3.8.2 组合仿函数(Composing Functors) 173
3.8.3 递归(Recursion) 175
3.8.4 泛型归纳函数(Generic Reduction) 179
3.9 匿名函数(Lambda) 180
3.9.1 捕获(Capture) 181
3.9.2 按值捕获(Capture by Value) 181
3.9.3 按引用捕获(Capture by Reference) 182
3.9.4 广义捕获(Generalized Capture) 184
3.9.5 泛型匿名函数(Generic Lambdas) 185
3.10 变参模板(Variadic Templates) 186
3.11 练习(Exercises) 188
3.11.1 字符串表示(String Representation) 188
3.11.2 元组的字符串表示(String Representation of Tuples) 188
3.11.3 泛型栈(Generic Stack) 188
3.11.4 向量的迭代器(Iterator of a Vector) 189
3.11.5 奇数迭代器(Odd Iterator) 189
3.11.6 奇数范围(Odd Range) 189
3.11.7 bool变量的栈(Stack of bool) 190
3.11.8 自定义大小的栈(Stack with Custom Size) 190
3.11.9 非类型模板参数的推导(Deducing Non-type Template Arguments) 190
3.11.10 梯形公式(Trapezoid Rule) 190
3.11.11 仿函数(Functor) 191
3.11.12 匿名函数(Lambda) 191
3.11.13 实现make_unique(Implement make_unique) 191
第4章 库(Libraries) 192
4.1 标准模板库(Standard Template Library) 193
4.1.1 入门示例(Introductory Example) 193
4.1.2 迭代器(Iterators) 194
4.1.3 容器(Containers) 199
4.1.4 算法(Algorithms) 208
4.1.5 超越迭代器(Beyond Iterators) 215
4.2 数值(Numerics) 216
4.2.1 复数(Complex Numbers) 217
4.2.2 随机数发生器(Random Number Generators) 220
4.3 元编程(Meta-programming) 230
4.3.1 极限(Limits) 230
4.3.2 类型特征(Type Traits) 232
4.4 支持库(Utilities) 234
4.4.1 元组(Tuple) 235
4.4.2 函数(function) 238
4.4.3 引用包装器(Reference Wrapper) 240
4.5 就是现在(The Time Is Now) 242
4.6 并发(Concurrency) 244
4.7 标准之外的科学计算程序库(Scientific Libraries Beyond the Standard) 248
4.7.1 其他算术运算库(Other Arithmetics) 248
4.7.2 区间算术(Interval Arithmetic) 248
4.7.3 线性代数(Linear Algebra) 249
4.7.4 常微分方程(Ordinary Differential Equations) 249
4.7.5 偏微分方程(Partial Differential Equations) 249
4.7.6 图论算法(Graph Algorithms) 250
4.8 练习(Exercises) 250
4.8.1 按模排序(Sorting by Magnitude) 250
4.8.2 STL容器(STL Container) 250
4.8.3 复数(Complex Numbers) 250
第5章 元编程(Meta-P
內容試閱
推荐序1:一些关于C 的大实话
我在北美这几年面试了上百位应聘者,这边的公司大多会让应聘者自选编程语言。我注意到一个现象,即使用C 作为面试语言的应聘者比例很低,大约不到110,在应届生中这个比例更低,远远不如我早前在上海和香港那几年面试的情况。在面试中,我也不再考察C 语法和标准库的知识点了。因为据我了解,即便是北美计算机科班出身的应届生也不一定在学校学过C ,他们学习的编程语言一般以Java或Python为主,然后因为操作系统或体系结构课程需要,会学一点C语言。这些新人参加工作之后,如果项目需要,会用两三周的时间,在原有的编程语言基础上快速入门C ,然后仿照项目现有代码的风格和习惯,开始上手C 编程。这种学习方式的优点是主次分明、重点突出、有的放矢。相比之下,其他专业的毕业生掌握C 的比例就更低了,我见过一些统计或者信号处理方向的博士们毕业之后进入工业界,需要把自己原来用R语言或者MATLAB实现的模型或算法用C 重写,使之融入公司的产品。正是因为有这样的开发者使用C 来完成工作中的开发任务,才赋予了这门语言蓬勃的生命力,否则它就只能沦为C 语言爱好者的玩物了。
换句话说,早前我刚参加工作那会儿的行情是:在学校学好C ,借此找到好工作。现在的情况变成了先学会编程,找份好工作,如果工作需要,再去学C 。本书正是适应这种新需求的产物,作者Peter Gottschling在科学计算领域颇有建树,也有丰富的教学经验,他的书抓住了重点,能够把C 常用功能的使用方法快速传授给读者。
其实,大多数普通程序员,包括我自己,在工作中很少有自由选择语言的权利。我在Morgan Stanley利用C 写了几年的实时外汇交易系统,后来在Google用C 写了几年的广告后台服务。并不是因为我擅长C 才决定在工作中采用C ,而是因为这些系统本来就是以C 为主的,我参与到其中,自然也得用C 来开发。话说回来,对于目前很多技术热点(Web和移动开发、机器学习)来说,C 并不是一门必须要学习和掌握的语言,很多不懂C 的程序员也能拥有相当辉煌的职业生涯。因此,对于C 初学者,与其问C 能做什么,不如多想想你需要用C 做什么。你想加入的公司或开发组是不是主要使用C 来开发项目?如果是,你掌握的C 知识是否足以胜任此项工作?
那么,C 要学到什么程度?其实项目越大,参与的人越多,使用的技术就会越趋于平凡,毕竟要照顾大家的平均水平,不宜剑走偏锋。对于多人开发的大中型项目,我认为大多数组员把C 学到能读懂并仿写LevelDB源码的程度,就足以应付日常的开发。只有那些写C 模板库给别人用的少数人,才需要钻研比较高深的模板(元)编程技术。举个例子,用逗号分隔字符串大家都会写,但是实现absl::StrSplit用到的语法就不是每个C 程序员都需要掌握的。
商业公司使用C 开发商业项目,一定有其充分理由。常见的理由有两个:节约成本、增加收入。节约成本,一般认为是节约机器(服务器)的成本。虽然大家都知道人比机器贵,但是当系统的规模大到一定程度(5万台以上可称为Warehouse-Scale Computers )时,节约10%的机器资源所能获得的收益就不容忽视了。 在竞争环境下,一个高效的系统有可能增加收入。例如,在实时在线广告竞价领域,用C 能在规定的期限(比如100ms)内对候选广告做更细致的评分,从中挑选出更有机会被用户点击的广告。对于在线广告公司来说,提升广告的点击率是能直接影响企业利润的核心需求,那么用C 来实现广告系统似乎是一个很自然的选择。
大家普遍认为,C 是一门高效的(efficient)语言,高效通常指的是节省机器资源,但高效不等于高性能(high performance)。随着摩尔定律的终结,目前高性能领域往往会使用特定硬件加速(Domain-Specific Architecture,DSA)。如果计算密集型的代码,要么用SIMD指令做向量化,要么放到GPU上去做并行计算,这样获得的性能提升通常会远超更换编程语言的效果。用CC 实现的AES加密算法再怎么优化,也比不过在CPU里加几条相关的指令。Google为了提高机器学习的效率,还专门研发了TPU加速芯片。 用C 写出来的程序一定是高性能的这种观点如今看来不免有些太天真了。
C 好用不好用,主要看你的工具和库好不好。我没见过哪个公司只用C 标准库做开发,因为标准库提供的功能实在是太少了,而且标准库提供的不一定是最好的选择。Google前不久开源了自己用的C 基础库Abseil,我尤其推荐其中的两个:
? 号称瑞士军刀的散列表,用于替换标准库中的unordered_setunordered_map。得益于memory locality,absl::flat_hash_map的性能显著高于std::unordered_map。
? 时间库,用于替换标准库中的std::chrono。
与10年前相比,C 的代码工具有了巨大的进步,这主要得益于LLVMClang为编写C 源码工具提供了坚实而便利的基础,让工具对C 代码的理解从正则表达式层面提升到了抽象语法树层面,从而能真正理解一段C 代码的语意。Clang-Tidy让稍具水平的程序员也能方便地编写工具来改进codebase的质量。 此外,新的运行时工具也有助于在测试阶段发现错误。
俗话说,到什么山头唱什么歌,在一个公司中多人合作编写代码时要遵循统一的约定,不能随心所欲地自由发挥。这里列出几个工业级的C 编码规范,它们各自都被上百万行的海量代码遵循着,可供大家借鉴并体会哪些知识点是反复强调、需要下功夫去好好掌握的:
? Google C Style GuideC Tips of the Week
? LLVM Coding Standards
? Qt Coding Conventions
值得一提的是,目前这几个规范都明确地禁用异常,因此我认为不必为C 异常投入过多的学习精力,将来的工作中很可能用不到。在工作中,对于可能返回错误的函数,我们一般的做法是返回Status或者StatusOr<T>。
最后,提一点建议:写一个新的类时,绝大多数情况下,请先禁用复制构造函数和赋值操作符,这将有效地防止浅复制导致的内存错误。
我期待将来有一天C 标准能采纳一个建议:把复制构造函数和赋值操作符默认删除(=delete),除非用户显式地定义它们。祝大家学习愉快!
陈 硕 美国加利福尼亚州 2019年7月
推荐序2
C 是一门强大的语言,而C 本身也在不断演进中,最新的标准已经演进到C 20,并引入了相当多引人注目的特性,如Concept、Module和Coroutine。相比C 20,本书着眼的C 1114是对编译器支持相对成熟,并且工业项目也愿意采用的C 新标准。C 1114相比C 9803也具有非常多的新特性,如auto、匿名函数、constexpr、move语义等。本书从丰富的代码例子出发,引出C 1114新特性要解决的问题,避免了过多的语言特性描述,这样可以很直观地让大家知道某个特性实际是要怎么使用的。但是,本书的不足之处在于有点发散,很多概念一笔带过。总体而言,瑕不掩瑜,本书对于已有C 9803基础,且想要快速补足C 1114知识的人群来说是一本合适的图书。
吴 钊(蓝色)
前言
世界是建立在C (以及它的C子集)上的。
Herb Sutter
Google、Amazon和Facebook的很多基础设施都构建于C 之上。还有相当一部分的其他底层技术也是使用C 实现的。在电信领域,几乎所有的固定电话和手机都由C 开发的软件所驱动。在德国,几乎所有的主要通信节点都是由C 处理的,这意味着作者的家庭也是C 的间接受益者。
即便是用其他语言编写的软件也可能会依赖于C ,因为最流行的编译器都是用C 实现的:比如Visual Studio、Clang,以及GNU和Intel编译器中较新的组件。 在Windows系统上运行的组件更是如此,因为Windows系统(以及Office)本身就是用C 开发的。C 无所不在,甚至你的手机和汽车,都一定包含了用C 开发的组件。C 的发明者Bjarne Stroustrup制作了一个示例网页,上述大部分例子都源于该网页。
科学和工程领域的许多高质量软件包也都是用C 实现的。当项目超过一定规模,且数据结构相当复杂时,C 的优势就会体现出来。这也是许多甚至可以说大多数科学和工程中的仿真软件程序(比如业内领头的Abaqus、deal.II、FEniCS、OpenFOAM,以及CATIA等一些CAD软件)都用C 来实现的原因。得益于处理器和编译器的发展,C 也越来越多地应用到嵌入式系统中(不过可能不是全部的现代语言特性和库都可以使用)。此外,我们不确定有多少项目如果晚些启动就会转用C ,而不会使用C。比如,著名的科学库PETSc的作者Matt Knepley(也是本书作者的好友)就承认,如果有可能,他更愿意用C 重写这个库。
学习C 的理由
和其他语言不同,从硬件编程到高级抽象编程,C 几乎都能胜任。底层编程如用户自定义的内存管理可以让程序员明确掌握程序是如何被执行的,它也会帮助你更好地了解其他语言中程序的行为。使用C 可以编写极高性能的程序。这些程序仅仅比花大力气用机器语言精心编写的代码性能略差一些。况且,程序员应该优先让软件的实现清晰明了,硬核的性能调优只是其次。

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 海外用户
megBook.com.tw
Copyright (C) 2013 - 2024 (香港)大書城有限公司 All Rights Reserved.