内容简介 · · · · · ·
汇集实用的C++编程解决方案,C++虽然是一门非凡的语言,但并不完美。Matthew Wilson使用C++十年有余,其间发现C++存在一些固有的限制,需要一些颇具技术性的工作进行弥补。本书不仅指出了C++的缺失,更为你编写健壮、灵活、高效、可维护的代码提供了实用的技术和工具。Wilson向你展示了如何克服C++的复杂性,穿越C++庞大的范式阵列。夺回对代码的控制权,从而获得更理想的结果。
作者简介 · · · · · ·
MatthewcWilson是一名软件开发顾问,STLSoft库的创建者,他为双月刊C/C++UserscJournal撰写关于将C/C++与其他语言和技术进行整合的专栏文章,同时亦是C++ExpertscForum在线专栏作家。Wilson有十余年C++开发经验。目前定居于澳大利亚。他拥有英国曼彻斯特大学博士学位。
荣耀是南京师范大学教师。他是一名C++讲师和研究者。译有《C++必知必会》、《C+Templates全览》以及《C++TemplatecMetaprogramming中文版》(中文繁体版)等,并在斯刊杂志上发表过多篇文章。他原任电力自动化研究院工程师与项目经理,是数个企业级信息系统项目负责人
刘未鹏毕业于南京大学软件学院,热爱C++,长期关注C++前沿技术,对C++有较深的研究。曾在《程序员》上发表文章数篇。个人blog是h...
MatthewcWilson是一名软件开发顾问,STLSoft库的创建者,他为双月刊C/C++UserscJournal撰写关于将C/C++与其他语言和技术进行整合的专栏文章,同时亦是C++ExpertscForum在线专栏作家。Wilson有十余年C++开发经验。目前定居于澳大利亚。他拥有英国曼彻斯特大学博士学位。
荣耀是南京师范大学教师。他是一名C++讲师和研究者。译有《C++必知必会》、《C+Templates全览》以及《C++TemplatecMetaprogramming中文版》(中文繁体版)等,并在斯刊杂志上发表过多篇文章。他原任电力自动化研究院工程师与项目经理,是数个企业级信息系统项目负责人
刘未鹏毕业于南京大学软件学院,热爱C++,长期关注C++前沿技术,对C++有较深的研究。曾在《程序员》上发表文章数篇。个人blog是http://blog.csdn.net/pongba。邮箱:pp_liu@msn.com
喜欢读"Imperfect C++中文版"的人也喜欢的电子书 · · · · · ·
喜欢读"Imperfect C++中文版"的人也喜欢 · · · · · ·
Imperfect C++中文版的话题 · · · · · · ( 全部 条 )



Imperfect C++中文版的书评 · · · · · · ( 全部 4 条 )
> 更多书评 4篇
-
扫帚的影子 (弱水三千,只取一瓢)
目录回到顶部↑ 第一部分 基础知识 1 第1章 强制设计:约束、契约和断言 3 1.1 绿蛋和火腿 4 1.2 编译期契约:约束. 4 1.2.1 musthavebase() 5 1.2.2 mustbesubscriptable() 6 1.2.3 mustbesubscriptableas_decayable_pointer() 6 1.2.4 mustbepod 1.2.5 must_besame_size() 9 1.2.6 使用约束 10 1.2.7 约束和tmp 11 1.2.8 约束:尾声 11 1.3 运行期契约:前置条件、后置条件和不变式 12 1.3.1 前置条件 13 1.3.2 后置条件 l3 1...2012-09-17 17:27
目录回到顶部↑ 第一部分 基础知识 1 第1章 强制设计:约束、契约和断言 3 1.1 绿蛋和火腿 4 1.2 编译期契约:约束. 4 1.2.1 musthavebase() 5 1.2.2 mustbesubscriptable() 6 1.2.3 mustbesubscriptableas_decayable_pointer() 6 1.2.4 mustbepod 1.2.5 must_besame_size() 9 1.2.6 使用约束 10 1.2.7 约束和tmp 11 1.2.8 约束:尾声 11 1.3 运行期契约:前置条件、后置条件和不变式 12 1.3.1 前置条件 13 1.3.2 后置条件 l3 1.3.3 类不变式 15 1.3.4 检查?总是进行 16 1.3.5 dbc还是不dbc 17 1.3.6 运行期契约:尾声 17 1.4 断言18 .1.4.1 获取消息19 1.4.2 不恰当的断言 20 1.4.3 语法以及64位指针21 1.4.4 避免使用verifv()21 1.4.5 为你的断言命名22 1.4.6 避免使用#ifdefdebug 23 1.4.7 debugbreak()和int3 24 1.4.8 静态/编译期断言 24 1.4.9 断言:尾声 26 第2章 对象生命期27 2.1 对象生命周期 27 2.2 控制你的客户端 28 2.2.1 成员类型 28 2.2.2 缺省构造函数28 2.2.3 拷贝构造函数29 2.2.4 拷贝赋值29 2.2.5 new和delete30 2.2.6 虚析构30 2.2.7 explicit3l 2.2.8 析构函数31 2.2.9 友元32 2.3 mil及其优点 33 2.3.1 取得一块更大的场地35 2.3.2 成员顺序依赖37 2.3.3 offsetoff)38 2.3.4 mll:尾声39 第3章 资源封装40 3.1 资源封装分类 40 3.2 pod类型 41 3.2.1 直接操纵41 3.2.2 api函数和透明类型42 3.2.3 api函数和不透明类型 42 3.3 外覆代理类 43 3.4 rrid类型 45 3.4.1 缺省初始化:缓式初始化46 3.4.2 未初始化48 3.5 raii类型51 3.5.1 常性raii和易变性rail 51 3.5.2 内部初始化和外部初始化53 3.5.3 rail排列 53 3.6 raii:尾声54 3.6.1 不变式54 3.6.2 错误处理54 第4章 数据封装和值类型 55 4.1 数据封装的分类学55 4.2 值类型和实体类型56 4.3 值类型的分类学56 4.4 开放式类型58 4.4.1 pod开放式类型 58 4.4.2 c++数据结构59 4.5 封装式类型60 4.6 值类型6l 4.7 算术值类型62 4.8 值类型:尾声63 4.9 封装:尾声64 第5章 对象访问模型68 5.1 确定性生命期68 5.2 返回拷贝70 5.3 直接交给调用者70 5.4 共享对象71 第6章 域守卫类73 6.1 值 73 6.2 状态 78 6.3 api和服务83 6.3.1 api83 6.3.2 服务86 6.4 语言特性87 第二部分生存在现实世界89 第7章 abi9l 7.1 共享代码91 7.2 cabi需求93 7.2.1 结构布局93 7.2.2 调用约定、符号名以及目标文件格式94 7.2.3 静态连接94 7.2.4 动态连接95 7.3 c++abi需求96 7.3.1 对象布局97 7.3.2 虚函数97 7.3.3 调用约定和名字重整97 7.3.4 静态连接99 7.3.5 动态连接99 7.4 现在知道怎么做了100 7.4.1 extern“c”100 7.4.2 名字空间103 7.4.3 extern“c++” 103 7.4.4 获得c++类的句柄106 7.4.5 “由实现定义”的隐患108 第8章 跨边界的对象 110 8.1 近乎可移植的虚函数表 110 8.1.1 虚函数表布局 111 8.1.2 动态操纵虚函数表 113 8.2 可移植的虚函数表114 8.2.1 利用宏进行简化116 8.2.2 兼容的编译器 116 8.2.3 可移植的服务端对象117 8.2.4 简化可移植接口的实现119 8.2.5 c客户代码 120 8.2.6 oab的约束120 8.3 abi/oab尾声121 第9章 动态库 123 9.1 显式调用函数123 9.1.1 显式调用c++函数124 9.1.2 打破c++访问控制125 9.2 同一性:连接单元和连接空间125 9.2.1 连接单元125 9.2.2连接空间 126 9.2.3 多重身份126 9.3 生命期127 9.4 版本协调128 9.4.1 丢失的函数 128 9.4.2 变化的签名 128 9.4.3 行为的改变 129 9.4.4 常量 129 9.5 资源所有权130 9.5.1 共享池-130 9.5.2 返还给被调用方 130 9.6 动态库:尾声 131 第10章 线程 132 10.1 对整型值的同步访问133 10.1.1 操作系统函数134 10.1.2 原子类型135 10.2 对(代码)块的同步访问:临界区136 10.2.1 进程间互斥体和进程内互斥体 137 10.2.2 自旋互斥体138 10.3 原子整型的性能139 10.3.1 基于互斥体的原子整型139 10.3.2 运行期按架构派发141 10.3.3 性能比较142 10.3.4 原子整型操作:尾声143 10.4 多线程扩展144 10.4.1 synchronized 144 10.4.2 匿名synchronized147 10.4.3 atomic147 10.5 线程相关的存储148 10.5.1 重入148 10.5.2 线程相关的数据/线程局部存储148 10.5.3 declspec(thread)和tls150 10.5.4 tss库150 10.5.5 tss的性能155 第11章 静态对象156 11.1 非局部静态对象:全局对象157 11.1.1 编译单元内的顺序性158 11.1.2 编译单元间的顺序性159 11.1.3 利用main()避免全局变量161 11.1.4 全局对象尾声:顺序性162 11.2 单件163 11.2.1 meyers单件163 11.2.2 alexandrescu单件164 11.2.3 p时schwarz计数器:一个极妙的主意165 11.2.4 对api计数166 11.2.5 被计数的api、外覆类、代理类:最终得到一个顺序化的单件168 ll.3 函数范围内的静态对象169 11.3.1 牺牲缓式求值能力171 11.3.2 自旋互斥体是救星171 11.4 静态成员172 11.4.1 解决连接问题172 11.4.2 自适应代码174 11.5 静态对象:尾声175 第12章 优化176 12.1 内联函数176 12.1.1 警惕过早优化176 12.1.2 只含有头文件的库177 12.2 返回值优化一177 12.3 空基类优化 180 12.4 空派生类优化183 12.5 阻止优化 184 第三部分 语言相关的议题 188 第13章 基本类型189 13.1 可以给我来一个字节吗189 13.1.1 标明符号190 13.1.2 一切都在名字之中190 13.1.3 窥探void内部191 13.1.4额外的安全性..191 13.2 固定大小的整型192 13.2.1 平台无关性193 13.2.2 类型相关的行为 195 13.2.3 固定大小的整型:尾声197 13.3 大整型198 13.4 危险的类型-200 13.4.1 引用和临时对象200 13.4.2 bool201 第14章 数组和指针204 14.1 不要重复你自己204 14.2 数组退化为指针206 14.2.1 下标索弓f操作符的交换性206 14.2.2 阻止退化208 14.3 dimensiono()209 14.4 无法将数组传递给函数211 14.5 数组总是按地址进行传递214 14.6 派生类的数组215 14.6.1 通过指针保存多态类型 216 14.6.2 提供非缺省的构造函数217 14.6.3 隐藏向量式new和delete 218 14.6.4 使用std::vector 218 14.6.5 确保类型的大小相同219 14.7 不能拥有多维数组222 第15章 值 226 15.1 null的是非曲直226 15.2 回到0 232 15.3 屈服于事实235 15.4 字面量 236 15.4.1 整型236 15.4.2 后缀238 15.4.3 字符串240 15.5 常量一243 15.5.1 简单常量243 15.5.2 类类型常量244 15.5.3 成员常量245 15.5.4 类类型的成员常量248 第16章 关键字251 16..2 51.1interface 16.2 temporary 253 16.3 owner---256 16.4 explicit(一cast) 261 16.4.1 使用显式访问函数263 16.4.2 模拟显式转换264 16.4.3 使用特性垫片265 16.5 unique266 16.6 final267 16.7 不被支持的关键字267 第17章 语法270 17.1 类的代码布局270 17.2 条件表达式 273 17.2.1 “使它布尔”273 17.2.2 一个危险的赋值275 17.3 for277 17.3.1 初始化作用域277 17.3.2 异质初始化类型278 17.4 变量命名280 17.4.1 匈牙利命名法280 17.4.2 成员变量281 第18章 typedef-284 18.1 指针typedef286 18.2 定义里面有什么288 18.2.1 概念性的类型定义288 18.2.2 上下文相关的类型定义289 18.3 别名-292 18.3.1 错误的概念性类型互换293 18.3.2 不能对概念性类型进行重载294 18.4 true-typedef294 18.5 好的、坏的、丑陋的300 18.5.1 好的typedef300 18.5.2 坏的typedef303 18.5.3 可疑的typedef304 第四部分 感知式转换308 第19章 强制310 19.1 隐式转换310 19.2 c++中的强制311 19.3 适合使用c强制的场合312 19.4 模仿强制314 19.5 explicitcast-316 19.6 literai-cast32l 19.7 union_cast323 19.8 comstl::interface cast327 19.8 comstl::interface-cast_addref328 19.8.2 interface--cast--noaddref329 19.8.3 interface-casltest329 19.8.4 接口强制操作符的实现330 19.8.5 保护引用计数333 19.8.6 interface-cast-base334 19.8.7 iid-traits 335 19.8.8 interfacecast尾声336 19.9 boost::polymorphic_cast 337 19.10 强制:尾声 339 第20章 垫片 341 20.1 拥抱变化拥抱自由 341 20.2 特性垫片344 20.3 逻辑垫片346 20.4 控制垫片347 20.5 转换垫片348 20.6 复合式垫片概念350 20.6.1 访问垫片351 20.6.2 返回值生命期352 20.6.3 泛化的类型操纵354 20.6.4 效率方面的考虑356 20.7 名字空间和koenig查找 357 20.8 为何不使用traits 359 20.9 结构一致性 360 20.10 打破巨石362 20.11 垫片:尾声363 第21章 饰面365 21.1 轻量级raii366 21.2 将数据和操作绑定在一起367 21.2.1 pod_veneer 368 21.2.2 创建日志消息370 21.2.3 减少浪费 371 21.2.4 类型安全的消息类372 21.3 “擦亮”饰面概念374 21.4 饰面:尾声 376 第22章 螺栓377 22.1 添加功能 377 22.2 皮肤选择 378 22.3 非虚重写 379 22.4 巧用作用域 380 22.5 拟编译期多态:逆反式螺栓 383 22.6 参数化多态包装384 22.7 螺栓:尾声 386 第23章 模板构造函数387 23.1 不易察觉的开销389 23.2 悬挂引用 389 23.3 模板构造函数特化391 23.4 实参代理”392 23.5 明确实参的范畴394 23.6 模板构造函数:尾声395 第五部分 操作符一396 第24章 operatorbool()398 24.1 operatorint()const398 24.2 operatorvoid*()const 399 24.3 operatorbool()const*400 24.4 operator!()const401 24.5 operatorbooleanconst()const40l 24.6 operatorintboolean()const402 24.7 在现实世界中操作402 24.8 operator!407 第25章快速、非侵入性的字符串拼接408 25.1 fast_string_concatenator[]409 25.1.1 与用户自定义的字符串类协同工作409 25.1.2 将“拼接子”串起来 410 25.1.3 fast_string_concatenator类411 25.1.4 内部实现413 25.2 性能417 25.3 与其他字符串类协作420 25.3.1 整合进标准库中420 25.3.2 整合进可改动的现存类中420 25.3.3 与不可更改的类互操作420 25.4 拼接提示421 25.5 病态括号422 25.6 标准化423 第26章 你的地址是什么 424 26.1 无法得到真实的地址 424 26.1.1 stl式元素存放 424 26.1.2 atl外覆类和cadapt 425 26.1.3 获取真实的地址426 26.2 在转换过程中发生了什么427 26.3 我们返回什么429 26.4 你的地址是什么:尾声431 第27章 下标索引操作符 434 27.1 指针转换与下标索引操作符 434 27.1.1 选择隐式转换操作符 436 27.1.2 选择下标索弓j操作符 437 27.2 错误处理 437 27.3 返回值 439 第28章 增量操作符441 28.1 缺少后置式操作符442 28.2 效率443 第29章 算术类型446 29.1 类定义446 29.2 缺省构造 447 29.3 初始化(值构造) 447 29.4 拷贝构造函数 450 29.5 赋值 450 29.6 算术操作符 451 29.7 比较操作符452 29.8 访问值 452 29.9 sinteger64 453 29.10 截断、提升以及布尔测试453 29.10.1 截断453 29.10.2 提升 455 29.10.3 布尔测试455 29.11 算术类型:尾声456 第30章 短路458 第六部分 扩展c++460 第31章 返回值生命期461 31.1 返回值生命期问题分类461 31.1.1 局部变量462 31.1.2 局部静态对象462 31.1.3 析构后指针(postdeslructionpointers)462 31.2 为何按引用返回462 31.3 解决方案l:integer_to_string[] 462 31.4 解决方案2tss465 31.4.1 declspec(thread)466 31.4.2 win32tls 466 31.4.3 平台无关的api469 31.4.4 rvl470 31.5 解决方案3--扩展rvl470 31.5.1 解决线程内的rvl.ls问题471 31.5.2 rvl472 31.6 解决方案4--静态数组大小决议 472 31.7 解决方案5--转换垫片474 31.8 性能476 31.9 rvl:垃圾收集的大胜利477 31.10 可能的应用478 31.1l 返回值生命期:尾声478 第32章 内存一479 32.1 内存分类479 32.1.1 栈和静态内存479 32.1.2 栈扩张480 32.1.3 堆内存481 32.2 两者之间的折衷481 32.2.1 alloca()一482 32.2.2 vla 483 32.2.3 auto-buffer[]483 32.2.4 使用autobuffer486 32.2.5 ebo,在哪里487 32.2.6 性能488 32.2.7 堆、栈以及其他490 32.2.8 pod_vector[] 491 32.3 配置器 493 32.3.1 函数指针493 32.3.2 配置器接口494 32.3.3 每库初始化(per-libraryinitialization)495 32.3.4 每调用指定(per-callspecification)496 32.4 内存:尾声一496 第33章 多维数组497 33.1 激活下标索引操作符498 33.2 运行时确定大小499 33.2.1 可变长数组499 33.2.2 vector[...vector[t]500 33.2.3 boost::multi_array501 33.2.4 fixed_array_1/2/3/4d 501 33.3 编译期确定大小505 33.3.i boost::array 506 33.3.2 static_array1/2/3/4d 06 33.4 块访问一508 33.4.1 使用std::filln()509 33.4.2 array垫片_size510 33.5 性能一512 33.5.1 运行期确定大小513 33.5.2 编译期确定大小514 33.6 多维数组:尾声515 第34章 仿函数和区间516 34.1 语法混乱516 34.2 for_all()517 34.2.1 数组518 34.2.2 命名518 34.3 局部仿函数520 34.3.1 手写循环520 34.3.2 自定义仿函数521 34.3.3 内嵌的仿函数521 34.3.4 温和一些523 34.3.5 泛化的仿函数:类型隧道(typetunneling)524 34.3.6 再进一步,走得太远了526 34.3.7 局部仿函数和回调api-527 34.4 区间 529 34.4.1 区间概念529 34.4.2 概念性区间531 34.4.3 可迭代区间533 34.4.4 区间算法和标签533 34.4.5 过滤器535 34.4.6 虚伪536 34.5 仿函数和区间:尾声536 第35章 属性537 35.1 编译器扩展539 35.2 可供选择的实现方案539 35.2.1 将属性的实现分门别类540 35.2.2 emo 540 35.3 字段属性541 35.3.1 field__property_get541 35.3.2 field__property_set 545 35.3.3 内置武字段属性:尾声 546 35.3.4 field_property_gellexternal546 35.3.5 field__propertyset--external 547 35.3.6 hack掉 547 35.4 方法属性 548 35.4.1 method_property_get 548 35.4.2 method_property_set 555 35.4.3 method__property_getset 555 35.4.4 谨防无限循环557 35.4.5 method_property_get-external 558 35.4.6 method_property_set-external561 35.4.7 method_property_getset-external562 35.5 静态属性一564 35.5.1 静态字段属性564 35.5.2 内置式静态方法属性564 35.5.3 外置式静态方法属性566 35.6 虚属性一567 35.7 属性的使用568 35.7.1 泛化性568 35.7.2 错误诊断中的类型替换.569 35.8 属性:尾声570 附录a 编译器和库572 a.1 编译器572 a.2 库573 a.2.1 boost574 a.2.2 stlsoft574 a.2.3 其他库574 a.3 其他资源575 a.3.1 期刊575 a.3.2 其他语言575 a.3.3 新闯组576 附录b “谦虚点,别骄傲”-577 b.1 操作符重载577 b.2 后悔dry579 b.3 偏执式编程579 b.4 精神错乱580 附录c arturius... 582 附录 d随书光盘583 尾声584 参考书目585
回应 2012-09-17 17:27 -
扫帚的影子 (弱水三千,只取一瓢)
1、 所有标量类型(基本类型和指针类型)、POD结构类型、POD联合类型、以及这几种类型的数组、const/volatile修饰的版 本都是POD类型。 2、 POD结构/联合类型:一个聚合体(包括class),它的非static成员都不是pointer to class member、 pointer to class member function、非POD结构、非POD联合,以及这些类型的数组、引用、const/ volatile修饰的版本; 并且,此聚合体不能有用户自定义的构造函数、析构函数、拷贝构造函数...2012-09-07 09:30
1、 所有标量类型(基本类型和指针类型)、POD结构类型、POD联合类型、以及这几种类型的数组、const/volatile修饰的版 本都是POD类型。 2、 POD结构/联合类型:一个聚合体(包括class),它的非static成员都不是pointer to class member、 pointer to class member function、非POD结构、非POD联合,以及这些类型的数组、引用、const/ volatile修饰的版本; 并且,此聚合体不能有用户自定义的构造函数、析构函数、拷贝构造函数. 3、 POD类型可以具有static成员、成员typedef、嵌套struct/class定义和 成员函数/方法。 (C++标准)给出的定义: 将对象的各字节拷贝到一个字节数组中,然后再将它重新拷贝到原先的对象所占的存储区中,此时该对象应该具有它原来的值。 POD类型的特点: 所有POD类型都可以作为union的成员,反之,所有非POD类型都不能作为union的成员。 POD特性利用: 我们可以利用POD类型特性来判断一个类型是否为POD类型: template<class T> struct must_be_pod { union { T noname; }; }; 这个模板的意思是,只要类型T是非POD类型,那么编译器将报错,因为T被作为了union的一个成员。 VS2008里的测试代码如下: class A { public: A(){} void f() { cout << "A::F" << endl; } protected: private: int i; int j; }; template<class T> struct must_be_pod { union { T noname; }; }; must_be_pod<A> a; 编译器会报错:1>member 'must_be_pod<T>::noname' of union 'must_be_pod<T>::<unnamed-tag>' has user-defined constructor or non-trivial default constructor 其实POD本质就是与c兼容的数据类型。
回应 2012-09-07 09:30
论坛 · · · · · ·
刘未鹏:一个强大的身影 | 来自Socrates | 2010-01-03 | |
废话太多 | 来自devdoer | 1 回应 | 2009-05-16 |
至少cpper应该读一遍的书。 | 来自Googol | 2008-03-06 |
这本书的其他版本 · · · · · · ( 全部4 )
-
Addison-Wesley Professional (2004)7.7分 12人读过
-
人民邮电出版社 (2012)7.6分 17人读过
-
人民邮电 (2006)暂无评分 6人读过
在哪儿借这本书 · · · · · ·
以下书单推荐 · · · · · · ( 全部 )
谁读这本书?
二手市场
订阅关于Imperfect C++中文版的评论:
feed: rss 2.0
0 有用 扫帚的影子 2012-10-18
读完了,但我承认后面读的有点糙
0 有用 atyuwen 2009-11-11
太厚了,没看完
0 有用 Googol 2008-03-06
很好的书,详细讲解了C++的细节和解决办法
0 有用 lid 2012-12-19
C++中的不完美,只有了解缺点的同时,才能更好的了解C++本身.
0 有用 Jacky 2013-09-24
总感觉绕来绕去不知道想表达什么, 话都只讲到一半,例子也很差
0 有用 丸子(^.^)v 2018-10-29
一般这种书 都准备中英文两个版本 看中文觉得绕了 看得慢了 就看英文原版 不然大部分时候还是看中文版比较快 比较直接了当 = =
0 有用 Jacky 2013-09-24
总感觉绕来绕去不知道想表达什么, 话都只讲到一半,例子也很差
0 有用 对我就是那个谁 2013-05-28
没有工程经验的人看不懂的书。C++进阶必读之一,好评!
0 有用 lid 2012-12-19
C++中的不完美,只有了解缺点的同时,才能更好的了解C++本身.
0 有用 扫帚的影子 2012-10-18
读完了,但我承认后面读的有点糙