C++如何用智能指针管理内存资源


-
1.简介 C++作为一门应用广泛的高级编程语言,却没有像Java、C#等语言拥有垃圾回收(Garbage Collection )机制来自动进行内存管理,这也是C++一直被诟病的一点。C++在发展的过程中,一直致力于解决内存泄漏,C++虽然基于效率的考虑,没有采用垃圾回收机制,但从C++98开始,推出了智能指针(Smart Pointer)来管理内存资源,以弥补C++在内存管理上的技术空白。 智能指针是C++程序员们一件管理内存的利器,使用智能指针管理内存资源,实际上就是将申请的内存资源交由智能指针来管理,是RAII技术的一种实现。RAII是C++的之父Bjarne Stroustrup教授提

72KB
Android系统智能指针
2020-09-21在计算机系统中,资源是数量有限且对系统正常运行具有一定作用的元素。比如:网络套接字、互斥锁、文件句柄和内存等等,它们属于系统资源。由于系统的资源是有限的,所以,我们在编程使用系统资源时,都必须遵循一个步骤: 1):申请资源; 2):使用资源; 3):释放资源。 Android系统的运行时库层代码是用C++来编写的,用C++来写代码最容易出错的地方就是指针了,一旦使用不当,轻则造成内存泄漏,重则造成系统崩溃。不过系统为我们提供了智能指针,避免出现上述问题,本文将系统地分析Android系统智能指针(轻量级指针、强指针和弱指针)的实现原理。
22KB
寻找理想的智能指针-C++资源管理综述.docx
2020-11-05寻找理想的智能指针-C++资源管理综述 摘要C++中的资源管理历来是比较令人头痈的问题随着 C++0X标准的酝 酿这一问题再次引起了人们的关注本文将和您一道对C++中的资源管理方式 进行回顾分析与展望并探讨理想的智能指针应该满足哪些条件 C的时代 C语言中用指针来表示对资源的引用这里的资源包括动态内存堆内存 及同步对象文件对象等由操作系统抽象出来的对象有的操作系统中用句柄 handle^表示对这类
90KB
关于c++ 智能指针及 循环引用的问题
2020-12-26c++智能指针介绍 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露。如此c++引入 智能指针 ,智能指针即是C++ RAII的一种应用,可用于动态资源管理,资源即对象的管理策略。 智能指针在 <memory>标头文件的 std 命名空间中定义。 它们对 RAII 或 获取资源即初始化 编程惯用法至关重要。 RAII 的主要原则是为所有堆分配资源提供所有权,例如动态分配内存或系统对象句柄、析构函数包含要删除或释放资源的代码的堆栈分
57KB
【C++ 深入浅出】智能指针shared_ptr、unique_ptr、weak_ptr详解
2021-01-07xx智能指针:防止用户忘记释放掉指针所指的堆空间而造成内存泄漏 当一个对象应该被释放时,指向它的智能指针可以确保自动地释放它 智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。只有引用计数为0时,智能指针才会自动释放引用的内存资源。对shared_ptr进行初始化时不能将一个普通指针直接赋值给智能指针,因为一
105KB
ADO指针智能指针说明
2015-06-14ADO是微软最新的对象层次上的数据操作技术,它为操作OLE DB数据源提供了一套高层次自动化接口。尽管OLE DB 已经是一个强大的数据操作接口,然而大多数数据库应用开发者并不需要OLE DB提供的操作数据的底层控制接口。大多数开发者对于管理内存资源、手工聚合组件以及其它的底层操作接口并不是很感兴趣。另外,开发者经常使用高层的、不支持指针和C++函数调用规范的开发语言,OLE DB为这种需要提供了方便。
75KB
c++11&14-智能指针要点汇总
2020-12-17学c++的人都知道,在c++里面有一个痛点,就是动态内存的管理,就我所经历的一些问题来看,很多莫名其妙的问题,最后都发现是内存管理不当引起的。 但像java等其他一些语言则不会有这样的问题,为什么呢,因为它们有很好的处理内存的方法,比如java的垃圾回收机制,现在,我们c++终于也有了智能指针。 1. 什么是智能指针 简单地说,智能指针是用对象去管理一个资源指针,同时用一个计数器计算引用当前指针对象的个数,当管理指针的对象增加或减少时,计数器也相应加1或减1,当最后一个指针管理对象销毁时,计数器为1,此时在销毁指针管理对象的同时,也对指针管理对象所管理的指针进行delete操作。 下面我们介
67KB
C++ 中boost::share_ptr智能指针的使用方法
2021-01-21C++ 中boost::share_ptr智能指针的使用方法 最近项目中使用boost库的智能指针,感觉智能指针还是蛮强大的,在此贴出自己学习过程中编写的测试代码,以供其他想了解boost智能指针的朋友参考,有讲得不正确之处欢迎指出讨论。当然,使用boost智能指针首先要编译boost库,具体方法可以网上查询,在此不再赘述。 智能指针能够使C++的开发简单化,主要是它能够自动管理内存的释放,而且能够做更多的事情,即使用智能指针,则可以再代码中new了之后不用delete,智能指针自己会帮助你管理内存资源的释放。 Boost库的智能指针有很多种,下面通过示例代码来说明其中share_ptr的使用
26.81MB
最权威的C++教程_C++_Primer_Plus中文第五版+C++_Primer中文第四版(都含源码+习题)(共4分卷)分卷4
2023-04-30C++_Primer_Plus中文第五版 C++是在C语言基础上开发的一种集面向对象编程、通用编程和传统的过程化编程于一体的编程语言, 是C语言的超集。本书是根据2003年的ISO/ANSI C++标准编写的,通过大量短小精悍的程序详细而全面地阐 述了C++的基本概念和技术。 全书分17章和10个附录,分别介绍了C++程序的运行方式、基本数据类型、复合数据类型、循环和关系 表达式、分支语句和逻辑操作符、函数重载和函数模板、内存模型和名称空间、类的设计和使用、多态、 虚函数、动态内存分配、继承、代码重用、友元、异常处理技术、string类和标准模板库、输入/输出等内 容。 本书针对C++初学者,从C语言基础知识开始介绍,然后在此基础上详细阐述C++新增的特性,因此不要 求读者有较多C语言方面的背景知识。本书可作为高等院校C++课程的教材,也可供初学者自学C++时使用。 本书享有“程序员和开发人员学习C++的完整教程”的美誉,它经过仔细的测试,制作精细,是计算机 行业的经典著作。前4版在美国的总销售量超过了10万册。该书阐述了包括结构化代码和自顶向下设计在内 的编程原理,涵盖了类。继承。模板。异常以及最新的面向对象编程技术等内容。 作者Stephen Prata是受人尊敬的作者和教育家,他以清晰的语言,对C++做了具有启发性的、见解深 刻的介绍。本书在解释基本概念的同时,兼顾了C++语言的细节。书中通过大量简短、易于输入的范例,每 次阐述一两个概念,激励读者通过立刻应用来掌握全新的主题;而每章最后的复习题和编程练习则强调了 最重要的信息,并帮助读者消化最难以理解的概念。本书是一本友好而易于使用的自学指南,适合用做编 程课程的教材,也可供熟悉其他语言的开发人员参考,以更深入地理解C++语言的基本知识。 本书采用了各种教学技巧,以提高读者的学习效率: ● 兼顾基本c语言知识和C++特性; ● 就何时以及为何使用特性提供了概念性指南; ● 强调实践,通过简短、易于输入的范例每次阐述一两个概念; ● 包含几百个范例程序; ● 通过示意图、注意、提示等来组织和区分相关的概念; ● 提供了复习题和编程练习,让读者能够测试自己对所学知识的理解程度; ● 以极大的灵活性实际使用通用c++——不要求读者使用特定的计算机、操作系统或编译器; ● 以ISO/ANSI标准为基础,对模板、标准模板库、字符串类、异常、RTTI和名称空间进行了讨论。 译者介绍:Stephen Prata在加州肯特菲尔得的马林学院教授天文、物理和计算机科学。他毕业于加州理工 学院,在加州大学伯克利分校获得博士学位。Stephen本人或与他人合作编写的图书有十多本。他撰写的 The Waite Group's New C Primer Plus一书获得了计算机出版联合会1990年度最佳“How-to”计算机图书 奖;他撰写的The Waite Group's C++ Primer Plus一书获得了计算机出版联合会1991年度最佳“How-to” 计算机图书奖的提名。 前言 学习C++是一次探索之旅,因为这种语言容纳了好几种编程模式,其中包括面向对象编程、通用编程和 传统的过程化编程。随着新特性的不断添加,C++一度成为一个活动目标,不过现在有了2003年的ISO/ ANSIC++标准第二版后,已经稳定下来了。现代编译器支持该标准要求的多数或全部特性,程序员要花时间 来习惯这些特性的应用。本书第五版是按ISO/ANSI标准编写的,将介绍这种成熟的C++版本。 本书在介绍C++特性的同时,讨论了基本C语言,使二者成为有机的整体。书中介绍了C++的基本概念, 并通过短小精悍的程序来阐明,这些程序都很容易复制和试验。还介绍了输入和输出、如何让程序执行重 复性任务、如何让程序做出选择、处理数据的多种方式以及如何使用函数等内容。另外,还讲述了C++在C 语言的基础上新增的许多特性,其中包括: ● 类和对象。 ● 继承。 ● 多态、虚函数和RTTI(运行阶段类型识别)。 ● 函数重载。 ● 引用变量。 ● 通用(或独立于类型的)编程,这种技术是由模板和标准模板库(STL)提供的。 ● 处理错误条件的异常机制。 ● 管理函数、类和变量名的名称空间。 本书在传授知识方面有几个优点。大约20年前,《C Primer Plus))一书开创了优良的初级教程传统,本书 建立在这样的基础之上,吸收了其中很多成功的理念: ● 初级教程应当是友好的、便于使用的指南。 ● 初级教程不要求读者已经熟悉相关的编程概念。 ● 初级教程强调的是“实践性”学习,通过简短、容
33.37MB
最权威的C++教程_C++_Primer_Plus中文第五版+C++_Primer中文第四版(都含源码+习题)(共4分卷)分卷3
2023-04-22C++_Primer_Plus中文第五版 C++是在C语言基础上开发的一种集面向对象编程、通用编程和传统的过程化编程于一体的编程语言, 是C语言的超集。本书是根据2003年的ISO/ANSI C++标准编写的,通过大量短小精悍的程序详细而全面地阐 述了C++的基本概念和技术。 全书分17章和10个附录,分别介绍了C++程序的运行方式、基本数据类型、复合数据类型、循环和关系 表达式、分支语句和逻辑操作符、函数重载和函数模板、内存模型和名称空间、类的设计和使用、多态、 虚函数、动态内存分配、继承、代码重用、友元、异常处理技术、string类和标准模板库、输入/输出等内 容。 本书针对C++初学者,从C语言基础知识开始介绍,然后在此基础上详细阐述C++新增的特性,因此不要 求读者有较多C语言方面的背景知识。本书可作为高等院校C++课程的教材,也可供初学者自学C++时使用。 本书享有“程序员和开发人员学习C++的完整教程”的美誉,它经过仔细的测试,制作精细,是计算机 行业的经典著作。前4版在美国的总销售量超过了10万册。该书阐述了包括结构化代码和自顶向下设计在内 的编程原理,涵盖了类。继承。模板。异常以及最新的面向对象编程技术等内容。 作者Stephen Prata是受人尊敬的作者和教育家,他以清晰的语言,对C++做了具有启发性的、见解深 刻的介绍。本书在解释基本概念的同时,兼顾了C++语言的细节。书中通过大量简短、易于输入的范例,每 次阐述一两个概念,激励读者通过立刻应用来掌握全新的主题;而每章最后的复习题和编程练习则强调了 最重要的信息,并帮助读者消化最难以理解的概念。本书是一本友好而易于使用的自学指南,适合用做编 程课程的教材,也可供熟悉其他语言的开发人员参考,以更深入地理解C++语言的基本知识。 本书采用了各种教学技巧,以提高读者的学习效率: ● 兼顾基本c语言知识和C++特性; ● 就何时以及为何使用特性提供了概念性指南; ● 强调实践,通过简短、易于输入的范例每次阐述一两个概念; ● 包含几百个范例程序; ● 通过示意图、注意、提示等来组织和区分相关的概念; ● 提供了复习题和编程练习,让读者能够测试自己对所学知识的理解程度; ● 以极大的灵活性实际使用通用c++——不要求读者使用特定的计算机、操作系统或编译器; ● 以ISO/ANSI标准为基础,对模板、标准模板库、字符串类、异常、RTTI和名称空间进行了讨论。 译者介绍:Stephen Prata在加州肯特菲尔得的马林学院教授天文、物理和计算机科学。他毕业于加州理工 学院,在加州大学伯克利分校获得博士学位。Stephen本人或与他人合作编写的图书有十多本。他撰写的 The Waite Group's New C Primer Plus一书获得了计算机出版联合会1990年度最佳“How-to”计算机图书 奖;他撰写的The Waite Group's C++ Primer Plus一书获得了计算机出版联合会1991年度最佳“How-to” 计算机图书奖的提名。 前言 学习C++是一次探索之旅,因为这种语言容纳了好几种编程模式,其中包括面向对象编程、通用编程和 传统的过程化编程。随着新特性的不断添加,C++一度成为一个活动目标,不过现在有了2003年的ISO/ ANSIC++标准第二版后,已经稳定下来了。现代编译器支持该标准要求的多数或全部特性,程序员要花时间 来习惯这些特性的应用。本书第五版是按ISO/ANSI标准编写的,将介绍这种成熟的C++版本。 本书在介绍C++特性的同时,讨论了基本C语言,使二者成为有机的整体。书中介绍了C++的基本概念, 并通过短小精悍的程序来阐明,这些程序都很容易复制和试验。还介绍了输入和输出、如何让程序执行重 复性任务、如何让程序做出选择、处理数据的多种方式以及如何使用函数等内容。另外,还讲述了C++在C 语言的基础上新增的许多特性,其中包括: ● 类和对象。 ● 继承。 ● 多态、虚函数和RTTI(运行阶段类型识别)。 ● 函数重载。 ● 引用变量。 ● 通用(或独立于类型的)编程,这种技术是由模板和标准模板库(STL)提供的。 ● 处理错误条件的异常机制。 ● 管理函数、类和变量名的名称空间。 本书在传授知识方面有几个优点。大约20年前,《C Primer Plus))一书开创了优良的初级教程传统,本书 建立在这样的基础之上,吸收了其中很多成功的理念: ● 初级教程应当是友好的、便于使用的指南。 ● 初级教程不要求读者已经熟悉相关的编程概念。 ● 初级教程强调的是“实践性”学习,通过简短、容
33.37MB
最权威的C++教程_C++_Primer_Plus中文第五版+C++_Primer中文第四版(都含源码+习题)(共4分卷)分卷2
2023-04-11C++_Primer_Plus中文第五版 C++是在C语言基础上开发的一种集面向对象编程、通用编程和传统的过程化编程于一体的编程语言, 是C语言的超集。本书是根据2003年的ISO/ANSI C++标准编写的,通过大量短小精悍的程序详细而全面地阐 述了C++的基本概念和技术。 全书分17章和10个附录,分别介绍了C++程序的运行方式、基本数据类型、复合数据类型、循环和关系 表达式、分支语句和逻辑操作符、函数重载和函数模板、内存模型和名称空间、类的设计和使用、多态、 虚函数、动态内存分配、继承、代码重用、友元、异常处理技术、string类和标准模板库、输入/输出等内 容。 本书针对C++初学者,从C语言基础知识开始介绍,然后在此基础上详细阐述C++新增的特性,因此不要 求读者有较多C语言方面的背景知识。本书可作为高等院校C++课程的教材,也可供初学者自学C++时使用。 本书享有“程序员和开发人员学习C++的完整教程”的美誉,它经过仔细的测试,制作精细,是计算机 行业的经典著作。前4版在美国的总销售量超过了10万册。该书阐述了包括结构化代码和自顶向下设计在内 的编程原理,涵盖了类。继承。模板。异常以及最新的面向对象编程技术等内容。 作者Stephen Prata是受人尊敬的作者和教育家,他以清晰的语言,对C++做了具有启发性的、见解深 刻的介绍。本书在解释基本概念的同时,兼顾了C++语言的细节。书中通过大量简短、易于输入的范例,每 次阐述一两个概念,激励读者通过立刻应用来掌握全新的主题;而每章最后的复习题和编程练习则强调了 最重要的信息,并帮助读者消化最难以理解的概念。本书是一本友好而易于使用的自学指南,适合用做编 程课程的教材,也可供熟悉其他语言的开发人员参考,以更深入地理解C++语言的基本知识。 本书采用了各种教学技巧,以提高读者的学习效率: ● 兼顾基本c语言知识和C++特性; ● 就何时以及为何使用特性提供了概念性指南; ● 强调实践,通过简短、易于输入的范例每次阐述一两个概念; ● 包含几百个范例程序; ● 通过示意图、注意、提示等来组织和区分相关的概念; ● 提供了复习题和编程练习,让读者能够测试自己对所学知识的理解程度; ● 以极大的灵活性实际使用通用c++——不要求读者使用特定的计算机、操作系统或编译器; ● 以ISO/ANSI标准为基础,对模板、标准模板库、字符串类、异常、RTTI和名称空间进行了讨论。 译者介绍:Stephen Prata在加州肯特菲尔得的马林学院教授天文、物理和计算机科学。他毕业于加州理工 学院,在加州大学伯克利分校获得博士学位。Stephen本人或与他人合作编写的图书有十多本。他撰写的 The Waite Group's New C Primer Plus一书获得了计算机出版联合会1990年度最佳“How-to”计算机图书 奖;他撰写的The Waite Group's C++ Primer Plus一书获得了计算机出版联合会1991年度最佳“How-to” 计算机图书奖的提名。 前言 学习C++是一次探索之旅,因为这种语言容纳了好几种编程模式,其中包括面向对象编程、通用编程和 传统的过程化编程。随着新特性的不断添加,C++一度成为一个活动目标,不过现在有了2003年的ISO/ ANSIC++标准第二版后,已经稳定下来了。现代编译器支持该标准要求的多数或全部特性,程序员要花时间 来习惯这些特性的应用。本书第五版是按ISO/ANSI标准编写的,将介绍这种成熟的C++版本。 本书在介绍C++特性的同时,讨论了基本C语言,使二者成为有机的整体。书中介绍了C++的基本概念, 并通过短小精悍的程序来阐明,这些程序都很容易复制和试验。还介绍了输入和输出、如何让程序执行重 复性任务、如何让程序做出选择、处理数据的多种方式以及如何使用函数等内容。另外,还讲述了C++在C 语言的基础上新增的许多特性,其中包括: ● 类和对象。 ● 继承。 ● 多态、虚函数和RTTI(运行阶段类型识别)。 ● 函数重载。 ● 引用变量。 ● 通用(或独立于类型的)编程,这种技术是由模板和标准模板库(STL)提供的。 ● 处理错误条件的异常机制。 ● 管理函数、类和变量名的名称空间。 本书在传授知识方面有几个优点。大约20年前,《C Primer Plus))一书开创了优良的初级教程传统,本书 建立在这样的基础之上,吸收了其中很多成功的理念: ● 初级教程应当是友好的、便于使用的指南。 ● 初级教程不要求读者已经熟悉相关的编程概念。 ● 初级教程强调的是“实践性”学习,通过简短、容
33.37MB
最权威的C++教程_C++_Primer_Plus中文第五版+C++_Primer中文第四版(都含源码+习题)(共4分卷)分卷1
2023-04-01C++_Primer_Plus中文第五版 C++是在C语言基础上开发的一种集面向对象编程、通用编程和传统的过程化编程于一体的编程语言, 是C语言的超集。本书是根据2003年的ISO/ANSI C++标准编写的,通过大量短小精悍的程序详细而全面地阐 述了C++的基本概念和技术。 全书分17章和10个附录,分别介绍了C++程序的运行方式、基本数据类型、复合数据类型、循环和关系 表达式、分支语句和逻辑操作符、函数重载和函数模板、内存模型和名称空间、类的设计和使用、多态、 虚函数、动态内存分配、继承、代码重用、友元、异常处理技术、string类和标准模板库、输入/输出等内 容。 本书针对C++初学者,从C语言基础知识开始介绍,然后在此基础上详细阐述C++新增的特性,因此不要 求读者有较多C语言方面的背景知识。本书可作为高等院校C++课程的教材,也可供初学者自学C++时使用。 本书享有“程序员和开发人员学习C++的完整教程”的美誉,它经过仔细的测试,制作精细,是计算机 行业的经典著作。前4版在美国的总销售量超过了10万册。该书阐述了包括结构化代码和自顶向下设计在内 的编程原理,涵盖了类。继承。模板。异常以及最新的面向对象编程技术等内容。 作者Stephen Prata是受人尊敬的作者和教育家,他以清晰的语言,对C++做了具有启发性的、见解深 刻的介绍。本书在解释基本概念的同时,兼顾了C++语言的细节。书中通过大量简短、易于输入的范例,每 次阐述一两个概念,激励读者通过立刻应用来掌握全新的主题;而每章最后的复习题和编程练习则强调了 最重要的信息,并帮助读者消化最难以理解的概念。本书是一本友好而易于使用的自学指南,适合用做编 程课程的教材,也可供熟悉其他语言的开发人员参考,以更深入地理解C++语言的基本知识。 本书采用了各种教学技巧,以提高读者的学习效率: ● 兼顾基本c语言知识和C++特性; ● 就何时以及为何使用特性提供了概念性指南; ● 强调实践,通过简短、易于输入的范例每次阐述一两个概念; ● 包含几百个范例程序; ● 通过示意图、注意、提示等来组织和区分相关的概念; ● 提供了复习题和编程练习,让读者能够测试自己对所学知识的理解程度; ● 以极大的灵活性实际使用通用c++——不要求读者使用特定的计算机、操作系统或编译器; ● 以ISO/ANSI标准为基础,对模板、标准模板库、字符串类、异常、RTTI和名称空间进行了讨论。 译者介绍:Stephen Prata在加州肯特菲尔得的马林学院教授天文、物理和计算机科学。他毕业于加州理工 学院,在加州大学伯克利分校获得博士学位。Stephen本人或与他人合作编写的图书有十多本。他撰写的 The Waite Group's New C Primer Plus一书获得了计算机出版联合会1990年度最佳“How-to”计算机图书 奖;他撰写的The Waite Group's C++ Primer Plus一书获得了计算机出版联合会1991年度最佳“How-to” 计算机图书奖的提名。 前言 学习C++是一次探索之旅,因为这种语言容纳了好几种编程模式,其中包括面向对象编程、通用编程和 传统的过程化编程。随着新特性的不断添加,C++一度成为一个活动目标,不过现在有了2003年的ISO/ ANSIC++标准第二版后,已经稳定下来了。现代编译器支持该标准要求的多数或全部特性,程序员要花时间 来习惯这些特性的应用。本书第五版是按ISO/ANSI标准编写的,将介绍这种成熟的C++版本。 本书在介绍C++特性的同时,讨论了基本C语言,使二者成为有机的整体。书中介绍了C++的基本概念, 并通过短小精悍的程序来阐明,这些程序都很容易复制和试验。还介绍了输入和输出、如何让程序执行重 复性任务、如何让程序做出选择、处理数据的多种方式以及如何使用函数等内容。另外,还讲述了C++在C 语言的基础上新增的许多特性,其中包括: ● 类和对象。 ● 继承。 ● 多态、虚函数和RTTI(运行阶段类型识别)。 ● 函数重载。 ● 引用变量。 ● 通用(或独立于类型的)编程,这种技术是由模板和标准模板库(STL)提供的。 ● 处理错误条件的异常机制。 ● 管理函数、类和变量名的名称空间。 本书在传授知识方面有几个优点。大约20年前,《C Primer Plus))一书开创了优良的初级教程传统,本书 建立在这样的基础之上,吸收了其中很多成功的理念: ● 初级教程应当是友好的、便于使用的指南。 ● 初级教程不要求读者已经熟悉相关的编程概念。 ● 初级教程强调的是“实践性”学习,通过简短、容
57.21MB
c++ primer 第5版(李普曼)
2015-07-31难以计数的程序员已经通过旧版的《C++ Primer》学会了C++语言。而在这段时间中,C++本身又已成熟了许多:语言本身的关注点和程序设计社区的关注点都已大大开阔,已经从主要关注机器效率转变为更多地关注编程效率。 2011年,C++标准委员会发布了ISO C++标准的一个重要修订版。此修订版是C++进化过程中的最新一步,延续了前几个版本对编程效率的强调。新标准的主要目标是: 使语言更为统一,更易于教学 使标准库更简单、安全、使用更高效 使编写高效率的抽象和库变得更简单 因此,在这个版本的《C++ Primer》中,我们进行了彻底的修改,使用了最新的C++标准,即C++11。为了了解新标准是如何全面影响C++语言的,你可以看一下xxiii页至xxv页的新特性列表,其中列出了哪些章节涉及了C++的新特性。 新标准增加的一些特性是具有普适性的,例如用于类型推断的auto。这些新特性使本书中的代码更易于阅读和理解。程序(以及程序员!)可以忽略类型的细节,从而更容易集中精力于程序逻辑上来。其他一些新特性,例如智能指针和允许移动的容器,允许我们编写更为复杂的类,而又不必与错综复杂的资源管理做斗争。因此,在本书中开始讲授如何编写自己的类,会比第4版简单得多。旧标准中阻挡在我们前进路上的很多细节,你我都不必再担心了。 对于本书中涉及新标准定义的新特性的那些部分,我们都已用一个特殊的图标标记出来了。我们希望这些提示标记对那些已经熟悉C++语言核心内容的读者是有帮助的,可以帮助他们决定将注意力投向哪里。对于那些可能尚不支持所有新特性的编译器,我们还希望这些图标能有助于解释这类编译器所给出的编译错误信息。这是因为虽然本书中几乎所有例子都已经用最新版本的GNU编译器编译通过,但我们知道一些读者可能尚未将编译器更新到最新版本。虽然新标准增加了大量新功能,但核心C++语言并未变化,这构成了本书的大部分内容。读者可以借助这些图标来判断哪些功能可能还没有被自己的编译器所支持。 为什么选择这本书? 现代C++语言可以看作是三部分组成的: 低级语言,大部分继承自C语言。 现代高级语言特性,允许我们定义自己的类型以及组织大规模程序和系统。 标准库,它利用高级特性来提供有用的数据结构和算法。 大多数C++教材按照语言进化的顺序来组织其内容。首先讲授C++的C子集,然后将C++的更为抽象的一些特性作为高级话题在书的最后进行介绍。这种方式存在两个问题:读者会陷入那些继承自低级程序设计的细节,从而由于挫折感而放弃;读者被强加学习一些坏习惯,随后又需要忘记这些内容。 我们采用一种相反的方法:从一开始就介绍一些语言特性,能让程序员忽略那些继承自低级程序设计的细节。例如,在介绍和使用内置的算术和数组类型时,我们还连同介绍和使用标准库中的类型string和vector。使用这些类型的程序更易写、易理解且更少出错。 太多时候,标准库被当作一种“高级”话题来讲授。很多教材不使用标准库,而是使用基于字符数组指针和动态内存管理的低级程序设计技术。让使用这种低级技术的程序正确运行,要比编写相应的使用标准库的C++代码困难得多。 贯穿全书,我们都在强调好的风格:我们想帮助读者直接养成好的习惯,而不是在获得很多很复杂的知识后再去忘掉那些坏习惯。我们特别强调那些棘手的问题,并对常见的错误想法和陷阱提出警告。 我们还注意解释规则背后的基本原理——使读者不仅知其然,还能知其所以然。我们相信,通过体会程序的工作原理,读者会更快地巩固对语言的理解。 虽然你不必为了学习本书而掌握C语言,但我们还是假定你了解足够多的程序设计知识,了解至少一门现代分程序结构语言,知道如何用这门语言编写、编译以及运行程序。特别是,我们假定你已经使用过变量,编写、调用过函数,也使用过编译器。 第5版变化的内容
33.11MB
深入理解C++11:C++11新特性解析与应用
1950-10-15《深入理解C++11:C++11新特性解析与应用》主要内容:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IBM XL编译器中国开发团队共同撰写。不仅详细阐述了C++11标准的设计原则,而且系统地讲解了C++11新标准中的所有新语言特性、新标准库特性、对原有特性的改进,以及如何应用所有这些新特性。 全书一共8章:第1章从设计思维和应用范畴两个维度对C++11新标准中的所有特性进行了分类,呈现了C++11新特性的原貌;第2章讲解了在保证与C语言和旧版C++标准充分兼容的原则下增加的一些新特性;第3章讲解了具有广泛可用性、能与其他已有的或者新增的特性结合起来使用的、具有普适性的一些新特性;第4章讲解了C++11新标准对原有一些语言特性的改进,这些特性不仅能让C++变得更强大,还能提升程序员编写代码的效率;第5章讲解了C++11在安全方面所做的改进,主要涵盖枚举类型安全和指针安全两个方面的内容;第6章讲解了为了进一步提升和挖掘C++程序性能和让C++能更好地适应各种新硬件的发展而设计的新特性,如多核、多线程、并行编程方面的新特性;第7章讲解了一些颠覆C++一贯设计思想的新特性,如lambda表达式等;第8章讲解了C++11为了解决C++编程中各种典型实际问题而做出的有效改进,如对Unicode的深入支持等。附录中则介绍了C++11标准与其他相关标准的兼容性和区别、C++11中弃用的特性、编译器对C++11的支持情况,以及学习C++11的相关资源。 《深入理解C++11:C++11新特性解析与应用》 免责声明 序 前言 第1章 新标准的诞生 1 1.1 曙光:C++11标准的诞生 1 1.1.1 C++11/C++0x(以及C11/C1x)—新标准诞生 1 1.1.2 什么是C++11/C++0x 2 1.1.3 新C++语言的设计目标 3 1.2 今时今日的C++ 5 1.2.1 C++的江湖地位 5 1.2.2 C++11语言变化的领域 5 1.3 C++11特性的分类 7 1.4 C++特性一览 11 1.4.1 稳定性与兼容性之间的抉择 11 1.4.2 更倾向于使用库而不是扩展语言来实现特性 12 1.4.3 更倾向于通用的而不是特殊的手段来实现特性 13 1.4.4 专家新手一概支持 13 1.4.5 增强类型的安全性 14 1.4.6 与硬件紧密合作 14 1.4.7 开发能够改变人们思维方式的特性 15 1.4.8 融入编程现实 16 1.5 本书的约定 17 1.5.1 关于一些术语的翻译 17 1.5.2 关于代码中的注释 17 1.5.3 关于本书中的代码示例与实验平台 18 第2章 保证稳定性和兼容性 19 2.1 保持与C99兼容 19 2.1.1 预定义宏 19 2.1.2 __func__预定义标识符 20 2.1.3 _Pragma操作符 22 2.1.4 变长参数的宏定义以及__VA_ARGS__ 22 2.1.5 宽窄字符串的连接 23 2.2 long long整型 23 2.3 扩展的整型 25 2.4 宏__cplusplus 26 2.5 静态断言 27 2.5.1 断言:运行时与预处理时 27 2.5.2 静态断言与static_assert 28 2.6 noexcept修饰符与noexcept操作符 32 2.7 快速初始化成员变量 36 2.8 非静态成员的sizeof 39 2.9 扩展的friend语法 40 2.10 final/override控制 44 2.11 模板函数的默认模板参数 48 2.12 外部模板 50 2.12.1 为什么需要外部模板 50 2.12.2 显式的实例化与外部模板的声明 52 2.13 局部和匿名类型作模板实参 54 2.14 本章小结 55 第3章 通用为本,专用为末 57 3.1 继承构造函数 57 3.2 委派构造函数 62 3.3 右值引用:移动语义和完美转发 68 3.3.1 指针成员与拷贝构造 68 3.3.2 移动语义 69 3.3.3 左值、右值与右值引用 75 3.3.4 std::move:强制转化为右值 80 3.3.5 移动语义的一些其他问题 82 3.3.6 完美转发 85 3.4 显式转换操作符 89 3.5 列表初始化 92 3.5.1 初始化列表 92 3.5.2 防止类型收窄 96 3.6 POD类型 98 3.7 非受限联合体 106 3.8 用户自定义字面量 110 3.9 内联名字空间 113 3.10 模板的别名 118 3.11 一般化的SFINEA规则 119 3.12 本章小结 121 第4章 新手易学,老兵易用 123 4.1 右尖括号>的改进 123 4.2 auto类型推导 124 4.2.1 静态类型、动态类型与类型推导 124 4.2.2 auto的优势 126 4.2.3 auto的使用细则 130 4.3 decltype 134 4.3.1 typeid与decltype 134 4.3.2 decltype的应用 136 4.3.3 decltype推导四规则 140 4.3.4 cv限制符的继承与冗余的符号 143 4.4 追踪返回类型 145 4.4.1 追踪返回类型的引入 145 4.4.2 使用追踪返回类型的函数 146 4.5 基于范围的for循环 150 4.6 本章小结 153 第5章 提高类型安全 155 5.1 强类型枚举 155 5.1.1 枚举:分门别类与数值的名字 155 5.1.2 有缺陷的枚举类型 156 5.1.3 强类型枚举以及C++11对原有枚举类型的扩展 160 5.2 堆内存管理:智能指针与垃圾回收 163 5.2.1 显式内存管理 163 5.2.2 C++11的智能指针 164 5.2.3 垃圾回收的分类 167 5.2.4 C++与垃圾回收 169 5.2.5 C++11与最小垃圾回收支持 170 5.2.6 垃圾回收的兼容性 172 5.3 本章小结 173 第6章 提高性能及操作硬件的能力 174 6.1 常量表达式 174 6.1.1 运行时常量性与编译时常量性 174 6.1.2 常量表达式函数 176 6.1.3 常量表达式值 178 6.1.4 常量表达式的其他应用 180 6.2 变长模板 183 6.2.1 变长函数和变长的模板参数 183 6.2.2 变长模板:模板参数包和函数参数包 185 6.2.3 变长模板:进阶 189 6.3 原子类型与原子操作 196 6.3.1 并行编程、多线程与C++11 196 6.3.2 原子操作与C++11原子类型 197 6.3.3 内存模型,顺序一致性与memory_order 203 6.4 线程局部存储 214 6.5 快速退出:quick_exit与at_quick_exit 216 6.6 本章小结 219 第7章 为改变思考方式而改变 220 7.1 指针空值—nullptr 220 7.1.1 指针空值:从0到NULL,再到nullptr 220 7.1.2 nullptr和nullptr_t 223 7.1.3 一些关于nullptr规则的讨论 225 7.2 默认函数的控制 227 7.2.1 类与默认函数 227 7.2.2 “= default”与“= deleted” 230 7.3 lambda函数 234 7.3.1 lambda的一些历史 234 7.3.2 C++11中的lambda函数 235 7.3.3 lambda与仿函数 238 7.3.4 lambda的基础使用 240 7.3.5 关于lambda的一些问题及有趣的实验 243 7.3.6 lambda与STL 247 7.3.7 更多的一些关于lambda的讨论 254 7.4 本章小结 256 第8章 融入实际应用 258 8.1 对齐支持 258 8.1.1 数据对齐 258 8.1.2 C++11的alignof和alignas 261 8.2 通用属性 267 8.2.1 语言扩展到通用属性 267 8.2.2 C++11的通用属性 268 8.2.3 预定义的通用属性 270 8.3 Unicode支持 274 8.3.1 字符集、编码和Unicode 274 8.3.2 C++11中的Unicode支持 276 8.3.3 关于Unicode的库支持 280 8.4 原生字符串字面量 284 8.5 本章小结 286 附录A C++11对其他标准的不兼容项目 287 附录B 弃用的特性 294 附录C 编译器支持 301
18.39MB
开学了,有路网团购太便宜啦! C++编程惯用法(高级程序员常用方法和技巧)/深入C++系列(C++ Strategies and Tactics)
2005-07-11在国际象棋中,学会如何移动棋子只能算是入门:要想掌控整个棋局,我们必须了解自己所下的每一步棋后的策略和战术。在C++中也同样如此。掌握正确的策略可以帮助我们避免常见的陷阱,并提高我们的工作效率。在本书中,C++专家Rob Murray就与我们分享了他宝贵的经验和建议,以帮助初中级C++程序员得到进一步的提高。 在本书中,作者大量采用了实际开发中的代码来作为示例,向读者展示了那些有用的编程策略,并对那些有害的做法进行了警示。为了帮助读者更好地理解,在书中的每一章结束前,在该章中被介绍过的主要内容都被放到了一个列表中,此外,书中还给出了一些问题来激励读者们进行更多的思考和讨论。 本书在一开始就向我们讲解了如何为我们的设计选择正确的抽象,提示我们注意抽象和现实之间的区别。然后,我们就将学到如何将已得到的抽象转化成一个(或多个)C++中的类,期间进行的讨论所涵盖的范围上至高层的设计策略,下至底层的接口和实现细节。 接下来本书对单继承和多重继承进行了深入的探索。一开始书中会给出一个关于它们应该用在设计的什么地方的讨论,然后就是一些详细的示例代码,用来向我们演示如何在实践中使用这些概念。对于 mulu 代译者序 序 第0章 简介 0.1 关于示例代码 0.2 本书的组织 0.3 问题 0.4 语言规则 第1章 抽象 1.1 有关电话号码的抽象模型 1.2 抽象模型间的关系 1.3 请考虑边界条件 1.4 使用CRC卡片来辅助设计 1.5 小结 1.6 问题 第2章 类 2.1 构造函数 2.2 赋值 2.3 公用数据 2.4 隐式类型转换 2.5 操作符重载:成员或非成员? 2.6 重载、缺省值以及省略符 2.7 Const 2.8 返回值为引用 2.9 静态对象的构造 2.10 小结 2.11 问题 第3章 句柄 3.1 一个String类 3.2 使用计数器来避免多份拷贝 3.3 避免进行重编译:Cheshire Cat 3.4 使用句柄来隐藏设计 3.5 多种实现 3.6 作为对象的句柄 3.7 综述 3.8 小结 3.9 问题 第4章 继承 4.1 is-a关系 4.2 公有继承 4.3 私有继承 4.4 保护型继承 4.5 与基类抽象的一致性 4.6 纯虚函数 4.7 有关继承的细节和陷阶 4.8 小结 4.9 问题 第5章 多重继承 5.1 作为交集的多重继承 5.2 虚基类 5.3 一些有关多重继承的细节问题 5.4 小结 5.5 问题 第6章 考虑继承的设计 6.1 被保护的接口 6.2 我们的设计是否应该考虑到继承? 6.3 一些为继承所做的设计的例子 6.4 结论 6.5 小结 6.6 问题 第7章 模板 7.1 模板类Pair 7.2 一些有关模板的细节 7.3 模板的实例化 7.4 智能指针 7.5 作为模板参数的表达式 7.6 模板函数 7.7 小结 7.8 问题 第8章 模板的高级用法 8.1 使用了模板的容器类 8.2 示例:Block 8.3 有关Block的设计细节 8.4 带有迭代器的容器:List 8.5 迭代器的设计细节 8.6 性能上的考虑 8.7 对模板参数的限制 8.8 模板特化 8.9 小结 8.10 问题 第9章 重用 9.1 发现和获得 9.2 健壮性 9.3 内存管理 9.4 可选的内存分配方案 9.5 传递参数给operator new 9.6 管理外部资源 9.7 寻找有关内存的bug 9.8 名字冲突 9.9 性能 9.10 不要去猜想,而应该度量! 9.11 算法 9.12 动态内存分配中的瓶颈 9.13 内嵌 9.14 Tiemann法则 9.15 小结 9.16 问题 第10章 异常 10.1 一个负面的声明 10.2 为什么需要异常? 10.3 一个异常的例子 10.4 异常只应该用来表述异常情况 10.5 理解异常 10.6 责任评估 10.7 设计异常对象 10.8 小结 10.9 问题 第11章 向C++移植 11.1 选择使用C++ 11.2 采用C++ 11.3 设计和实现 11.4 开发一个坚实的基础 11.5 相关的思考 11.6 小结 11.7 问题
9.21MB
C++编程惯用法——高级程序员常用方法和技巧.pdf
2009-04-17简介: 本书采用实际开发中的代码作为示例,介绍实用的编程策略,并以列表形式展示主要内容,涉及抽象、类、句柄、模板等。 目录: 代译者序 序 第0章 简介 0.1 关于示例代码 0.2 本书的组织 0.3 问题 0.4 语言规则 第1章 抽象 1.1 有关电话号码的抽象模型 1.2 抽象模型间的关系 1.3 请考虑边界条件 1.4 使用CRC卡片来辅助设计 1.5 小结 1.6 问题 第2章 类 2.1 构造函数 2.2 赋值 2.3 公用数据 2.4 隐式类型转换 2.5 操作符重载:成员或非成员? 2.6 重载、缺省值以及省略符 2.7 Const 2.8 返回值为引用 2.9 静态对象的构造 2.10 小结 2.11 问题 第3章 句柄 3.1 一个String类 3.2 使用计数器来避免多份拷贝 3.3 避免进行重编译:Cheshire Cat 3.4 使用句柄来隐藏设计 3.5 多种实现 3.6 作为对象的句柄 3.7 综述 3.8 小结 3.9 问题 第4章 继承 4.1 is-a关系 4.2 公有继承 4.3 私有继承 4.4 保护型继承 4.5 与基类抽象的一致性 4.6 纯虚函数 4.7 有关继承的细节和陷阶 4.8 小结 4.9 问题 第5章 多重继承 5.1 作为交集的多重继承 5.2 虚基类 5.3 一些有关多重继承的细节问题 5.4 小结 5.5 问题 第6章 考虑继承的设计 6.1 被保护的接口 6.2 我们的设计是否应该考虑到继承? 6.3 一些为继承所做的设计的例子 6.4 结论 6.5 小结 6.6 问题 第7章 模板 7.1 模板类Pair 7.2 一些有关模板的细节 7.3 模板的实例化 7.4 智能指针 7.5 作为模板参数的表达式 7.6 模板函数 7.7 小结 7.8 问题 第8章 模板的高级用法 8.1 使用了模板的容器类 8.2 示例:Block 8.3 有关Block的设计细节 8.4 带有迭代器的容器:List 8.5 迭代器的设计细节 8.6 性能上的考虑 8.7 对模板参数的限制 8.8 模板特化 8.9 小结 8.10 问题 第9章 重用 9.1 发现和获得 9.2 健壮性 9.3 内存管理 9.4 可选的内存分配方案 9.5 传递参数给operator new 9.6 管理外部资源 9.7 寻找有关内存的bug 9.8 名字冲突 9.9 性能 9.10 不要去猜想,而应该度量! 9.11 算法 9.12 动态内存分配中的瓶颈 9.13 内嵌 9.14 Tiemann法则 9.15 小结 9.16 问题 第10章 异常 10.1 一个负面的声明 10.2 为什么需要异常? 10.3 一个异常的例子 10.4 异常只应该用来表述异常情况 10.5 理解异常 10.6 责任评估 10.7 设计异常对象 10.8 小结 10.9 问题 第11章 向C++移植 11.1 选择使用C++ 11.2 采用C++ 11.3 设计和实现 11.4 开发一个坚实的基础 11.5 相关的思考 11.6 小结 11.7 问题
75.8MB
C++ Primer第四版【中文高清扫描版】.pdf
2012-03-13【原书名】 C++ Primer (4th Edition) 【原出版社】 Addison Wesley/Pearson 【作者】 (美)Stanley B.Lippman,Josée LaJoie,Barbara E.Moo 【译者】 李师贤 蒋爱军 梅晓勇 林瑛 【丛书名】 图灵计算机科学丛书 【出版社】 人民邮电出版社 【书号】 7-115-14554-7 【开本】 16开 【页码】 900 【出版日期】 2006-3-1 【版次】 4-1 【内容简介】 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。本版对前一版进行了彻底的修订,内容经过了重新组织,更加入了C++ 先驱Barbara E. Moo在C++教学方面的真知灼见。既显著改善了可读性,又充分体现了C++语言的最新进展和当前的业界最佳实践。书中不但新增大量教学辅助内容,用于强调重要的知识点,提醒常见的错误,推荐优秀的编程实践,给出使用提示,还包含大量来自实战的示例和习题。对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。本书的前言阐述了 第4版和前一版的不同之处。 【目录信息】 第1章 快速入门 1 1.1 编写简单的C++程序 2 1.2 初窥输入/输出 5 1.2.1 标准输入与输出对象 5 1.2.2 一个使用IO库的程序 5 1.3 关于注释 8 1.4 控制结构 10 1.4.1 while语句 10 1.4.2 for语句 12 1.4.3 if语句 14 1.4.4 读入未知数目的输入 15 1.5 类的简介 17 1.5.1 Sales_item类 17 1.5.2 初窥成员函数 19 1.6 C++程序 21 小结 22 术语 22 第一部分 基本语言 第2章 变量和基本类型 29 2.1 基本内置类型 30 2.1.1 整型 30 2.1.2 浮点型 32 2.2 字面值常量 34 2.3 变量 38 2.3.1 什么是变量 39 2.3.2 变量名 40 2.3.3 定义对象 42 2.3.4 变量初始化规则 44 2.3.5 声明和定义 45 2.3.6 名字的作用域 46 2.3.7 在变量使用处定义变量 48 2.4 const限定符 49 2.5 引用 50 2.6 typedef名字 53 2.7 枚举 53 2.8 类类型 54 2.9 编写自己的头文件 57 2.9.1 设计自己的头文件 58 2.9.2 预处理器的简单介绍 60 小结 62 术语 62 第3章 标准库类型 67 3.1 命名空间的using声明 68 3.2 标准库string类型 70 3.2.1 string对象的定义和初始化 70 3.2.2 String对象的读写 71 3.2.3 string对象的操作 72 3.2.4 string对象中字符的处理 76 3.3 标准库vector类型 78 3.3.1 vector对象的定义和初始化 79 3.3.2 vector对象的操作 81 3.4 迭代器简介 83 3.5 标准库bitset类型 88 3.5.1 bitset对象的定义和初始化 88 3.5.2 bitset对象上的操作 90 小结 92 术语 92 第4章 数组和指针 95 4.1 数组 96 4.1.1 数组的定义和初始化 96 4.1.2 数组操作 99 4.2 指针的引入 100 4.2.1 什么是指针 100 4.2.2 指针的定义和初始化 101 4.2.3 指针操作 104 4.2.4 使用指针访问数组元素 106 4.2.5 指针和const限定符 110 4.3 C风格字符串 113 4.3.1 创建动态数组 117 4.3.2 新旧代码的兼容 120 4.4 多维数组 122 小结 124 术语 125 第5章 表达式 127 5.1 算术操作符 129 5.2 关系操作符和逻辑操作符 131 5.3 位操作符 134 5.3.1 bitset对象或整型值的使用 135 5.3.2 将移位操作符用于IO 137 5.4 赋值操作符 137 5.4.1 赋值操作的右结合性 138 5.4.2 赋值操作具有低优先级 138 5.4.3 复合赋值操作符 139 5.5 自增和自减操作符 140 5.6 箭头操作符 142 5.7 条件操作符 143 5.8 sizeof操作符 144 5.9 逗号操作符 145 5.10 复合表达式的求值 145 5.10.1 优先级 145 5.10.2 结合性 146 5.10.3 求值顺序 148 5.11 new和delete表达式 150 5.12 类型转换 154 5.12.1 何时发生隐式类型转换 154 5.12.2 算术转换 155 5.12.3 其他隐式转换 156 5.12.4 显式转换 158 5.12.5 何时需要强制类型转换 158 5.12.6 命名的强制类型转换 158 5.12.7 旧式强制类型转换 160 小结 161 术语 162 第6章 语句 165 6.1 简单语句 166 6.2 声明语句 167 6.3 复合语句(块) 167 6.4 语句作用域 168 6.5 if语句 169 6.6 switch语句 172 6.6.1 使用switch 173 6.6.2 switch中的控制流 173 6.6.3 default标号 175 6.6.4 switch表达式与case标号 176 6.6.5 switch内部的变量定义 176 6.7 while语句 177 6.8 for循环语句 179 6.8.1 省略for语句头的某些部分 180 6.8.2 for语句头中的多个定义 181 6.9 do while语句 182 6.10 break语句 183 6.11 continue语句 184 6.12 goto语句 185 6.13 try块和异常处理 186 6.13.1 throw表达式 186 6.13.2 try块 187 6.13.3 标准异常 189 6.14 使用预处理器进行调试 190 小结 192 术语 192 第7章 函数 195 7.1 函数的定义 196 7.1.1 函数返回类型 197 7.1.2 函数形参表 198 7.2 参数传递 199 7.2.1 非引用形参 199 7.2.2 引用形参 201 7.2.3 vector和其他容器类型的形参 206 7.2.4 数组形参 206 7.2.5 传递给函数的数组的处理 209 7.2.6 main:处理命令行选项 210 7.2.7 含有可变形参的函数 211 7.3 return语句 211 7.3.1 没有返回值的函数 212 7.3.2 具有返回值的函数 212 7.3.3 递归 216 7.4 函数声明 217 7.5 局部对象 220 7.5.1 自动对象 220 7.5.2 静态局部对象 220 7.6 内联函数 221 7.7 类的成员函数 222 7.7.1 定义成员函数的函数体 223 7.7.2 在类外定义成员函数 225 7.7.3 编写Sales_item类的构造 函数 225 7.7.4 类代码文件的组织 227 7.8 重载函数 228 7.8.1 重载与作用域 230 7.8.2 函数匹配与实参转换 231 7.8.3 重载确定的三个步骤 232 7.8.4 实参类型转换 234 7.9 指向函数的指针 237 小结 239 术语 240 第8章 标准IO库 243 8.1 面向对象的标准库 244 8.2 条件状态 247 8.3 输出缓冲区的管理 249 8.4 文件的输入和输出 251 8.4.1 文件流对象的使用 251 8.4.2 文件模式 254 8.4.3 一个打开并检查输入文件的 程序 256 8.5 字符串流 257 小结 259 术语 259 第二部分 容器和算法 第9章 顺序容器 263 9.1 顺序容器的定义 264 9.1.1 容器元素的初始化 265 9.1.2 容器内元素的类型约束 267 9.2 迭代器和迭代器范围 268 9.2.1 迭代器范围 270 9.2.2 使迭代器失效的容器操作 271 9.3 顺序容器的操作 272 9.3.1 容器定义的类型别名 272 9.3.2 begin和end成员 273 9.3.3 在顺序容器中添加元素 273 9.3.4 关系操作符 277 9.3.5 容器大小的操作 278 9.3.6 访问元素 279 9.3.7 删除元素 280 9.3.8 赋值与swap 282 9.4 vector容器的自增长 284 9.5 容器的选用 287 9.6 再谈string类型 289 9.6.1 构造string对象的其他方法 290 9.6.2 修改string对象的其他方法 292 9.6.3 只适用于string类型的操作 293 9.6.4 string类型的查找操作 295 9.6.5 string对象的比较 298 9.7 容器适配器 300 9.7.1 栈适配器 301 9.7.2 队列和优先级队列 302 小结 303 术语 303 第10章 关联容器 305 10.1 引言:pair类型 306 10.2 关联容器 308 10.3 map类型 309 10.3.1 map对象的定义 309 10.3.2 map定义的类型 310 10.3.3 给map添加元素 311 10.3.4 使用下标访问map对象 311 10.3.5 map::insert的使用 313 10.3.6 查找并读取map中的元素 315 10.3.7 从map对象中删除元素 316 10.3.8 map对象的迭代遍历 316 10.3.9 “单词转换”map对象 317 10.4 set类型 319 10.4.1 set容器的定义和使用 319 10.4.2 创建“单词排除”集 321 10.5 multimap和multiset类型 322 10.5.1 元素的添加和删除 322 10.5.2 在multimap和multiset 中查找元素 323 10.6 容器的综合应用:文本查询程序 325 10.6.1 查询程序的设计 326 10.6.2 TextQuery类 327 10.6.3 TextQuery类的使用 328 10.6.4 编写成员函数 330 小结 332 术语 332 第11章 泛型算法 335 11.1 概述 336 11.2 初窥算法 339 11.2.1 只读算法 339 11.2.2 写容器元素的算法 341 11.2.3 对容器元素重新排序的算法 343 11.3 再谈迭代器 347 11.3.1 插入迭代器 348 11.3.2 iostream迭代器 349 11.3.3 反向迭代器 353 11.3.4 const迭代器 355 11.3.5 五种迭代器 356 11.4 泛型算法的结构 358 11.4.1 算法的形参模式 359 11.4.2 算法的命名规范 359 11.5 容器特有的算法 361 小结 362 术语 363 第三部分 类和数据抽象 第12章 类 367 12.1 类的定义和声明 368 12.1.1 类定义:扼要重述 368 12.1.2 数据抽象和封装 369 12.1.3 关于类定义的更多内容 372 12.1.4 类声明与类定义 374 12.1.5 类对象 375 12.2 隐含的this指针 376 12.3 类作用域 380 类作用域中的名字查找 382 12.4 构造函数 385 12.4.1 构造函数初始化式 387 12.4.2 默认实参与构造函数 391 12.4.3 默认构造函数 392 12.4.4 隐式类类型转换 393 12.4.5 类成员的显式初始化 396 12.5 友元 396 12.6 static类成员 398 12.6.1 static成员函数 400 12.6.2 static数据成员 400 小结 403 术语 403 第13章 复制控制 405 13.1 复制构造函数 406 13.1.1 合成的复制构造函数 409 13.1.2 定义自己的复制构造函数 409 13.1.3 禁止复制 410 13.2 赋值操作符 411 13.3 析构函数 412 13.4 消息处理示例 415 13.5 管理指针成员 419 13.5.1 定义智能指针类 421 13.5.2 定义值型类 425 小结 427 术语 427 第14章 重载操作符与转换 429 14.1 重载操作符的定义 430 14.2 输入和输出操作符 435 14.2.1 输出操作符<<的重载 435 14.2.2 输入操作符>>的重载 437 14.3 算术操作符和关系操作符 439 14.3.1 相等操作符 440 14.3.2 关系操作符 441 14.4 赋值操作符 441 14.5 下标操作符 442 14.6 成员访问操作符 443 14.7 自增操作符和自减操作符 446 14.8 调用操作符和函数对象 449 14.8.1 将函数对象用于标准库算法 450 14.8.2 标准库定义的函数对象 451 14.8.3 函数对象的函数适配器 453 14.9 转换与类类型 454 14.9.1 转换为什么有用 454 14.9.2 转换操作符 455 14.9.3 实参匹配和转换 458 14.9.4 重载确定和类的实参 461 14.9.5 重载、转换和操作符 464 小结 466 术语 467 第四部分 面向对象编程与泛型编程 第15章 面向对象编程 471 15.1 面向对象编程:概述 472 15.2 定义基类和派生类 473 15.2.1 定义基类 474 15.2.2 protected成员 475 15.2.3 派生类 476 15.2.4 virtual与其他成员函数 479 15.2.5 公用、私有和受保护的继承 482 15.2.6 友元关系与继承 486 15.2.7 继承与静态成员 486 15.3 转换与继承 487 15.3.1 派生类到基类的转换 487 15.3.2 基类到派生类的转换 489 15.4 构造函数和复制控制 490 15.4.1 基类构造函数和复制控制 490 15.4.2 派生类构造函数 490 15.4.3 复制控制和继承 494 15.4.4 虚析构函数 495 15.4.5 构造函数和析构函数中的虚函数 497 15.5 继承情况下的类作用域 497 15.5.1 名字查找在编译时发生 498 15.5.2 名字冲突与继承 498 15.5.3 作用域与成员函数 499 15.5.4 虚函数与作用域 500 15.6 纯虚函数 502 15.7 容器与继承 503 15.8 句柄类与继承 504 15.8.1 指针型句柄 505 15.8.2 复制未知类型 507 15.8.3 句柄的使用 508 15.9 再谈文本查询示例 511 15.9.1 面向对象的解决方案 513 15.9.2 值型句柄 514 15.9.3 Query_base类 515 15.9.4 Query句柄类 516 15.9.5 派生类 518 15.9.6 eval函数 520 小结 522 术语 523 第16章 模板与泛型编程 525 16.1 模板定义 526 16.1.1 定义函数模板 526 16.1.2 定义类模板 528 16.1.3 模板形参 529 16.1.4 模板类型形参 531 16.1.5 非类型模板形参 533 16.1.6 编写泛型程序 534 16.2 实例化 535 16.2.1 模板实参推断 537 16.2.2 函数模板的显式实参 540 16.3 模板编译模型 542 16.4 类模板成员 545 16.4.1 类模板成员函数 548 16.4.2 非类型形参的模板实参 551 16.4.3 类模板中的友元声明 552 16.4.4 Queue和QueueItem的友元 声明 554 16.4.5 成员模板 556 16.4.6 完整的Queue类 558 16.4.7 类模板的static成员 559 16.5 一个泛型句柄类 560 16.5.1 定义句柄类 561 16.5.2 使用句柄 562 16.6 模板特化 564 16.6.1 函数模板的特化 565 16.6.2 类模板的特化 567 16.6.3 特化成员而不特化类 569 16.6.4 类模板的部分特化 570 16.7 重载与函数模板 570 小结 573 术语 574 第五部分 高级主题 第17章 用于大型程序的工具 579 17.1 异常处理 580 17.1.1 抛出类类型的异常 581 17.1.2 栈展开 582 17.1.3 捕获异常 583 17.1.4 重新抛出 585 17.1.5 捕获所有异常的处理代码 586 17.1.6 函数测试块与构造函数 586 17.1.7 异常类层次 587 17.1.8 自动资源释放 589 17.1.9 auto_ptr类 591 17.1.10 异常说明 595 17.1.11 函数指针的异常说明 598 17.2 命名空间 599 17.2.1 命名空间的定义 599 17.2.2 嵌套命名空间 603 17.2.3 未命名的命名空间 604 17.2.4 命名空间成员的使用 606 17.2.5 类、命名空间和作用域 609 17.2.6 重载与命名空间 612 17.2.7 命名空间与模板 614 17.3 多重继承与虚继承 614 17.3.1 多重继承 615 17.3.2 转换与多个基类 617 17.3.3 多重继承派生类的复制控制 619 17.3.4 多重继承下的类作用域 620 17.3.5 虚继承 622 17.3.6 虚基类的声明 624 17.3.7 特殊的初始化语义 625 小结 628 术语 628 第18章 特殊工具与技术 631 18.1 优化内存分配 632 18.1.1 C++中的内存分配 632 18.1.2 allocator类 633 18.1.3 operator new函数和 operator delete函数 636 18.1.4 定位new表达式 638 18.1.5 显式析构函数的调用 639 18.1.6 类特定的new和delete 639 18.1.7 一个内存分配器基类 641 18.2 运行时类型识别 646 18.2.1 dynamic_cast操作符 647 18.2.2 typeid操作符 649 18.2.3 RTTI的使用 650 18.2.4 type_info类 652 18.3 类成员的指针 653 18.3.1 声明成员指针 653 18.3.2 使用类成员的指针 655 18.4 嵌套类 658 18.4.1 嵌套类的实现 658 18.4.2 嵌套类作用域中的名字查找 661 18.5 联合:节省空间的类 662 18.6 局部类 665 18.7 固有的不可移植的特征 666 18.7.1 位域 666 18.7.2 volatile限定符 668 18.7.3 链接指示:extern "C" 669 小结 672 术语 673 附录 标准库 675 索引 703
48.65MB
C++探秘:68讲贯通C++.[美]Ray Lischner(带详细书签).pdf 下载
2018-03-31内容简介 本书采用引导探索式的教学方法,将庞大的C++ 知识体系划分成四个大部分68 讲,每讲都包含一个互动练习,帮助读者循序渐进地学习C++。你可以通过这种互动快速掌握表达式、声明、标准库、自定义函数、类和模板等等C++ 的各方面特性,并最终掌握如何把这些特性组合起来编写复杂的C++ 程序。 本书适合有少量其他语言编程经验的C++ 初学者。 第一部分 C++基础 第1讲 打磨工具 1.1 作者推荐 1.1.1 windows平台 1.1.2 macintosh os 9以及更早版本 1.1.3 其他平台 1.2 阅读文档 1.3 第一个程序 第2讲 阅读C++代码 2.1 注释 2.2 头文件 2.3 主程序 2.4 变量定义 2.5 语句 2.6 输出 第3讲 整数表达式 第4讲 字符串 第5讲 简单的输入 第6讲 错误消息 6.1 拼写错误 6.2 错误字符 6.3 未知操作符 6.4 未知名字 6.5 符号错误 6.6 从错误中获得乐趣 第7讲 for循环 7.1 有界循环 7.1.1 初始化 7.1.2 条件 7.1.3 后循环 7.1.4 for循环的工作原理 7.2 由你来做 第8讲 格式化输出 8.1 问题 8.2 字段宽度 8.3 填充 8.4 std前缀 8.5 对齐 8.6 探索格式化 8.7 替代语法 8.8 由你完成 第9讲 数组和向量 9.1 用向量代替数组 9.2 向量 9.3 迭代器 9.4 算法 9.5 成员类型 9.6 使用迭代器和算法 第10讲 自增和自减 10.1 自增 10.2 自减 第11讲 条件和逻辑 11.1 i/o和bool 11.2 布尔类型 11.3 逻辑操作符 11.4 旧式语法 11.5 比较操作符 第12讲 复合语句 12.1 语句 12.2 局部定义和范围 12.3 for循环头中的定义 第13讲 文件i/o简介 13.1 读文件 13.2 写文件 第14讲 数据结构映射 14.1 使用映射 14.2 迭代器 14.3 搜索映射 第15讲 类型同义词 15.1 typedef声明 15.2 常见的类型定义 第16讲 字符 16.1 字符类型 16.2 字符i/o 16.3 换行和移植性 16.4 转义字符 第17讲 字符分类 17.1 字符集 17.2 字符分类 17.3 区域设置 第18讲 大小写转换 18.1 简单的大小写 18.2 复杂的大小写 第19讲 编写函数 19.1 函数 19.2 函数调用 19.3 声明和定义 19.4 再谈单词计数 19.5 函数main() 第20讲 函数实参 20.1 实参传递 20.2 按引用传递 20.3 常量引用 20.4 const_iterator 20.5 输出参数 第21讲 使用算法 21.1 传递数据 21.2 谓词 21.3 其他算法 第22讲 重载函数名 第23讲 大数和小数 23.1 长整型和短整型 23.1.1 长整数 23.1.2 短整数 23.2 整数字面量 23.3 字节长度的整数 23.4 类型转换 23.5 整数算术 23.6 重载解析 第24讲 极大数和极小数 24.1 浮点数 24.2 浮点字面量 24.3 浮点特征 24.4 浮点i/o 第25讲 文档 25.1 doxygen 25.2 结构化注释 25.3 文档标签 25.4 使用doxygen 第26讲 项目1:身体质量指数 第二部分 自定义类型 第27讲 自定义类型 27.1 定义新类型 27.2 成员函数 27.3 构造函数 27.4 重载构造函数 第28讲 重载操作符 28.1 比较有理数 28.2 算术操作符 28.3 数学函数 第29讲 自定义i/o操作符 29.1 输入操作符 29.2 输出操作符 29.3 错误状态 第30讲 赋值与初始化 30.1 赋值操作符 30.2 构造函数 30.3 合并 第31讲 编写类 31.1 类的结构 31.2 成员函数 31.3 构造函数 第32讲 深入探索成员函数 32.1 调用默认构造函数 32.2 重温project 1 32.3 const成员函数 第33讲 访问级别 33.1 公有与私有 33.2 class与struct 33.3 简单的旧式数据 33.4 公有还是私有 第34讲 面向对象编程介绍 34.1 书籍与杂志 34.2 分类 34.3 继承 34.4 liskov置换原则 34.5 类型多态 第35讲 继承 35.1 派生类 35.2 析构函数 35.3 访问级别 35.4 编程风格 第36讲 虚函数 36.1 类型多态 36.2 虚函数 36.3 引用与切除 36.4 纯虚函数 36.5 虚析构函数 第37讲 类与类型 37.1 类与typedef 37.2 值类型 37.2.1 复制 37.2.2 赋值 37.2.3 比较 37.3 资源获取即为初始化 第38讲 声明与定义 38.1 声明与定义 38.2 内联函数 38.3 变量声明与定义 38.4 静态变量 38.5 静态数据成员 38.6 声明符 第39讲 使用多个源文件 39.1 多个源文件 39.2 声明与定义 39.3 #include文件 39.3.1 引号与括号 39.3.2 嵌套#include指令 39.3.3 包含监护 39.3.4 文档 39.4 外部变量 39.5 内联函数 39.6 “一份定义”规则 第40讲 函数对象 40.1 函数调用操作符 40.2 函数对象 40.3 复用成员函数 40.4 生成器函子 第41讲 有用的算法 41.1 搜索 41.1.1 线性搜索算法 41.1.2 二分搜索算法 41.2 比较 41.3 重组织数据 41.4 复制数据 41.5 删除元素 41.6 迭代器 第42讲 迭代器 42.1 迭代器的种类 42.1.1 输入迭代器 42.1.2 输出迭代器 42.1.3 前向迭代器 42.1.4 双向迭代器 42.1.5 随机访问迭代器 42.2 使用迭代器工作 42.3 const_iterator与const iterator 42.4 错误消息 42.5 专用迭代器 42.6 迭代器要点 第43讲 异常 43.1 异常介绍 43.2 捕获异常 43.3 抛出异常 43.4 程序栈 43.5 标准异常 43.6 i/o异常 43.7 自定义异常 43.8 对异常的建议 第44讲 更多操作符 44.1 条件操作符 44.2 短路操作符 44.3 逗号操作符 44.4 算术赋值操作符 44.5 自增与自减 第45讲 项目2:定点数 第三部分 泛型编程 第46讲 函数模板 46.1 泛型函数 46.2 使用函数模板 46.3 编写函数模板 46.4 模板形参 46.5 模板实参 46.6 声明与定义 46.7 成员函数模板 第47讲 类模板 47.1 参数化类型 47.2 参数化rational类 47.3 使用类模板 47.4 重载的操作符函数 47.5 混合类型 第48讲 模板特化 48.1 实例化与特化 48.2 自定义比较函数 48.3 特化函数模板 48.4 特征 第49讲 部分特化 49.1 退化的pair 49.2 部分特化 49.3 部分特化函数模板 49.4 值模板形参 第50讲 名字与名字空间 50.1 名字空间 50.2 嵌套名字空间 50.3 全局名字空间 50.4 名字空间std 50.5 使用名字空间 50.5.1 using指令 50.5.2 using声明 50.5.3 类中的using声明 50.6 无名名字空间 50.7 名字查找 第51讲 容器 51.1 容器的性质 51.2 技术报告1 51.3 成员类型 51.4 容器里能放什么 51.5 插入与清除 51.5.1 顺序容器的插入操作 51.5.2 顺序容器的清除操作 51.5.3 关联容器的插入操作 51.5.4 关联容器的清除操作 51.5.5 异常 51.6 迭代器与引用 51.7 顺序容器 51.7.1 类模板array 51.7.2 类模板deque 51.7.3 类模板list 51.7.4 类模板vector 51.8 关联容器 第52讲 国际字符 52.1 为何要“宽” 52.2 使用宽字符 52.3 宽字符串 52.4 宽字符的i/o操作 52.5 多字节字符集 52.6 unicode 52.7 通用字符名字 第53讲 区域设置与分面 53.1 问题 53.2 拯救者“区域设置” 53.3 区域设置与i/o 53.4 分面 53.5 字符类别 53.6 排序规则 第54讲 文本i/o 54.1 文件模式 54.2 字符串流 54.3 文本转换 54.4 boost词法转换 第55讲 项目3:货币类型 第四部分 实时编程 第56讲 指针 56.1 问题 56.2 解决方案 56.3 地址与指针 56.4 依赖图 第57讲 动态内存 57.1 分配内存 57.2 释放内存 57.3 指向为空的指针 57.4 实现标准容器 57.5 增加变量 57.6 特殊成员函数 第58讲 异常-安全 58.1 内存泄漏 58.2 异常与动态内存 58.3 自动删除指针 58.4 auto_ptr不能做的事 58.5 异常与构造函数 第59讲 旧式数组 59.1 c风格的数组 59.2 数组的限制 59.3 动态分配数组 59.4 多维数组 59.5 c风格的字符串 59.6 命令行参数 59.7 指针运算 第60讲 智能指针 60.1 重新审视auto_ptr 60.2 可复制智能指针 60.3 智能数组 60.4 pimpl 60.5 迭代器 第61讲 位操作 61.1 将整数作为位的集合 61.2 位掩码 61.3 移位 61.4 使用无符号类型安全移位 61.4.1 有符号与无符号类型 61.4.2 无符号字面量 61.4.3 类型转换 61.5 溢出 61.6 位域简介 61.7 可移植性 61.8 bitset类模板 第62讲 枚举 62.1 理想的枚举 62.2 作为位掩码的枚举 62.3 模拟枚举 62.3.1 枚举计算机语言 62.3.2 对语言进行比较 62.3.3 赋值 62.3.4 字符串和语言 62.3.5 初始化 62.3.6 读写语言 62.3.7 使用模拟的枚举 62.4 重新审视项目 第63讲 多重继承 63.1 多重基类 63.2 虚基类 63.3 类java接口 63.4 接口与模板 63.5 mix-in 63.6 友元来帮忙 第64讲 特征萃取与策略 64.1 案例研究:迭代器 64.2 迭代器特征萃取 64.3 案例研究:char_traits 64.4 基于策略的编程 第65讲 名字与模板 65.1 限定名的问题 65.2 非限定名的问题 第66讲 重载函数 66.1 重载函数回顾 66.2 重载解析 66.2.1 候选函数 66.2.2 可行函数 66.2.3 最佳可行函数 66.3 默认实参 第67讲 元编程 67.1 编译时编程 67.2 模板特化 67.3 部分特化 第68讲 项目4:计算器
-
下载
unity银河系资源包TheGalaxyPack.zip
unity银河系资源包TheGalaxyPack.zip
-
下载
20210417-方正证券-化工新材料行业周报:一季度新能源车销量同比增长七成,雅克科技20年归母净利同增43.56%.pdf
20210417-方正证券-化工新材料行业周报:一季度新能源车销量同比增长七成,雅克科技20年归母净利同增43.56%.pdf
-
下载
20210418-方正证券-策略周报:全球主要股指分化的原因以及演绎.pdf
20210418-方正证券-策略周报:全球主要股指分化的原因以及演绎.pdf
-
下载
恶意代码第一章笔记.txt
恶意代码第一章笔记.txt
-
下载
20210416-天风证券-哔哩哔哩~SW-9626.HK-乘视频化浪潮,奔赴新十年征程.pdf
20210416-天风证券-哔哩哔哩~SW-9626.HK-乘视频化浪潮,奔赴新十年征程.pdf
-
下载
宇视社招一面资料宇视社招一面资料
宇视社招一面资料宇视社招一面资料
-
下载
20210418-华安证券-化工行业周报:严控高耗能环评审批,金禾“337”调查胜诉概率大.pdf
20210418-华安证券-化工行业周报:严控高耗能环评审批,金禾“337”调查胜诉概率大.pdf
-
下载
DFN0603_ESD0521CH (2).pdf
DFN0603_ESD0521CH (2).pdf
-
下载
校招恒生电子2020笔试题
校招恒生电子2020笔试题
-
下载
【方维众筹V1.71】完美无限制商业版+综合型众筹系统+会员管理+项目管理+资金管理+PC+WAP.zip
【方维众筹V1.71】完美无限制商业版+综合型众筹系统+会员管理+项目管理+资金管理+PC+WAP.zip
