C++ Primer Plus学习笔记.docx
《C++ Primer Plus学习笔记.docx》由会员分享,可在线阅读,更多相关《C++ Primer Plus学习笔记.docx(113页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、编译与链接目录编译与链接1程序创立的过程1创立源代码的文件1编译和链接2UNIX编译和链接2Linux编译和链接2Windows命令行编译器3程序创立的过程.使用文本编辑器编写程序,并将其保存到文件中,这个文件就是程序的源代码01 .编译源代码,这意味着运行一个程序,将源代码编译为主机使用的内部语言-机器语言。 包含了翻译后的程序的文件就是程序的目标代码。2 .将目标代码和其他代码链接起来。例如,C+程序通常使用库。C+ +库包含一系列计算 机例程(被称为函数)的目标代码,这些函数可以执行诸如在屏幕上显示信息或计算平 方根等任务。链接指的是将目标代码中使用的函数的目标代码以及一些标准的启动代码
2、 组合起来,生成程序的运行阶段版本。包含该最终产品的文件被称为可执行代码创立源代码的文件有些C+ +实现通过了集成开发环境,让你能够在主程序中管理程序开发的所有步骤, 包括编辑。有些实现只能处理编译和链接阶段,要求在系统命令行输入命令。在这种情况下, 可以使用任何文本编辑器来创立和修改源代码。给源文件命名时,必须使用正确的后缀,将文件标识为C+ +文件。这不仅告诉你该文件 是C+源代码,还将这种信息告知编译器。后缀由一个句点和一个或多个字符组成,这些字 符被称为扩展名。int hamburgers=24; C+ + 风格,可以用于数据或结构,也可以用于单值int emus7;/ C+11 风格
3、introcs = ;大括号中可以不包含任何东西,变量将被初始化为零初始化将赋值和声明合并在一起。也可以使用字面值常量来初始化。可以将变量初始化 为另一个变量,条件是后者已经定义过。甚至可以使用表达式来初始化变量,条件是当程序 执行到该声明时,表达式中所有的值都是的。选择整型类型C+提供了大量的整型,应使用哪种类型呢?通常,int被设置为对目标计算机而言最 为“自然”的长度。自然长度指的是计算机处理起来效率最高的长度。如果没有非常有说服 力的理由来选择其他类型,那么应使用int。整型字面值整型字面值(常量)是显式地书写的常量,如122或1776。与C相同,C+能够以三 种不同的计数方式来书写整
4、数:基数为10,基数为8和基数为16。C+使用前一(两)位 来标识数字常量的基数。如果第一位为1-9,那么基数为10 ;如果第一位为0,第二位为1- 7,那么基数为8 ;如果前两位为Ox或0X,那么基数为16oC+将整型常量储存为int类型。char类型:字符和小整型char类型式专门存储字符而设计的。现在,存储数字对于计算机来说算不了什么,但存 储字母那么是另一回事。编程语言通过使用字母的数值编码解决了这个问题。因此,char类型 是一种整型。它足够长,能够表示目标计算机系统中的所有基本符号-所有字母,数字,标 点符号等。实际上,很多系统支持的字符都不超过128个,因此用一个字节就可以表示所
5、有 的符号。因此,虽然char最常用于处理字符,但也可以将它用作比short更小的整型。signed char 和 unsigned char与int不同,char在默认情况下既不是没有符号,也不是有符号。是否有符号由C+实 现决定。这样编译器开发人员可以最大限度地将这种类型与硬件属性匹配起来。如果char 由某种特定的行为对你来说非常重要,那么可以显式地将类型设置为signed char或unsigned char。string类和标准模板库目录string类和标准模板库101string 类102string类的构造函数102s甘ing类的输入103使用字符串103智能指针模板类103使用
6、智能指针103有关智能指针的考前须知104unique_ptr 为何优于 auto_ptr104选择智能指针104标准模板库105模板类 vector105基于范围的for循环 (C+11) 105泛型编程105为何使用迭代器105迭代器类型106输入迭代器106输出迭代器107正向迭代器107双向迭代器107随机访问迭代器107其他有用的迭代器107反向迭代器107插入迭代器108容器类型108vector108deque108list108forwardjist109queue109priority_queue109stack109array109关联容器noset110unltimap1
7、10无关联容器(C+11) Ill函数对象Ill函数符概念112预定义的函数符112自适应函数符和函数适配器113算法114算法组115算法的通用特性115函数和容器方法116其他库116vector, valarray 和array117模板 initalizeijist(C+11) 117使用 initalizerjist117string 类string类的构造函数/可以将string对象初始化为常规的C-风格字符串 string one( Lottery Winner!);/将string对象two初始化为由20个$字符组成的字符串 string two(20,1 $);/复制构造函数
8、将string对象three初始化为string对象one string three(one);重载+=运算符将Oops!”附加到字符串。ne的后面 one += Oops!one += two;/重载=运算符two = wSorry! That wastwo = one; two = ?;/重教口运算符 threeO = F ;/默认构造函数创立一个以后可对其进行赋值的空字符串 string four;four = two+three;/将一个C-风格字符串和一个整数作为参数,其中对整数参数表示要复制多少个字符 char ailsf = AH s well that ends well;st
9、ring five(ails.2O);/使用begin和end指向的位置之间的值,对string对象进行初始化 template string(lter begin,Iter end);/能够将列表初始化语法用于string类string piano man= L I s : z : 1 ;string类的输入对于C-风格字符串,有3种char info100;cininfo;cin.getline(info.lOO);cin.get(info.lOO);对于string对象.有两种string stuff;cinstuff;getline(cin,stuff);功能上,它们的主要区别在于,s
10、tring版本的getline()将自动调整目标string对象的大小,使之刚好 能够存储输入的字符使用字符串可以比拟字符串,string类对全部6个关系运算符进行了重载。可以确定字符串长度,size。和length。成员函数都返回字符串中的字符数,length。成员 来自较早的string类,而size。那么是为提供STL兼容性而添加的。可以以多种不同的方式在字符串中搜索给定的子字符串或字符。使用find。方法。string 库还提 供了相关方法:rfind(), find.fi rst_of(), find_last_of(), find_first_not_of()和 find_last
11、_not_of(),它们的重载函数特征标都与find。方法相同。智能指针模板类智能指针式行为类似于指针的类对象,它可以自动回收new的内存。使用智能指针这三个智能指针模板(auto_ptr, unique_ptr和shared_ptr)都定义了类似指针的对象, 可以将new获得(直接或间接)的地址赋给这种对象。当智能指针过期时,其析构函数将 使用delete来释放内存。因此,如果将new返回的地址赋给这些对象,将无需记住稍后释 放的这些内存:在智能指针过期时,这些内存将自动被释放。要创立智能指针对象,必须包含头文件memory,该文件模板定义。然后使用通常的模 板语法来实例化所需的指针。aut
12、o_ptr pd(new double);auto_ptr ps(new double);new double是new返回的指针,指向新分配的内存块,他是构造函数auto_ptr 的参数,即对应于原型中形参p的实参,同样,new swing也是构造函数的实参,其他两种 智能指针使用同样的语法:unique_ptr pdu(new double);shared ptr pss(new string);有关智能指针的考前须知auto_ptr ps(new string( 1 regigned lonely as a cloud);auto_ptr vocation;vocation=ps;如果ps
13、和vocation是常规指针,那么两个指针将指向同一个string对象,这是不能接受的,因为程序将试图删除同一个对象两次,要防止这种问题,方法有多种: 定义赋值运算符,使之执行深复制。这样两个这种将指向不同的对象,其中一个对象是另一个对象的副本。 建立所有权概念,对于特定对象,只能有一个智能指针可拥有它,这样只有拥有对象的智能指针的构造函数会删除该对象。然后,让赋值操作转让所有权。这就是用于auto_ptr 和unique_ptr的策略,但unique_ptr的策略更严格。 创立智能更高的指针,跟踪引用特定对象的智能指针数。这称为引用计数。例如,赋值时,计数将加1.而指针过期时,计数将减1。仅
14、当最后一个指针过期时,才调用delete。 这是shared_ptr采用的策略。unique_ptr 为何优于 auto_ptrunique_ptr禁止把一个智能指针赋给另一个智能指针。 程序试图将一个unique.ptr赋给另一个时,如果源unique_ptr是个临时右值,编译器 允许这样作;如果源uniqujptr将存在一段时间,编译器将禁止这样作。 标准库函数std:move(),让你能够将一个unique_ptr赋给另一个。 unique,ptr 有使用 new。和 delete的版本,而 auto_ptr 使用 delete 而不是 deleted,因 此只能与new 一起使用,而不
15、能与new口一起使用。选择智能指针如果程序要使用多个指向一个对象的指针,应选择shared_ptro如果程序不需要多个指向同一个对象的指针,那么使用unique_ptr0在unique_ptr为右值时,可将其赋给shared_ptr,这与将一个unique_ptr赋给另一个需 要满足的条件相同。模板shar6cLptr包含一个显式构造函数,可用于将右值unique_ptr转 换为 shared_ptr0标准模板库模板类vector要创立vector模板对象,可使用通常的type表示法莱指出要使用的类型。另外,vector 模板使用动态内存分配,因此可以用初始化参数来指出需要多少矢量。由于运算符
16、被重载,因此创立vector对象后,可以使用通常的数组表示法来访问各个 兀素Osize():返回容器中元素数目swap():交换两个容器begin():返回一个指向容器中第一个元素的迭代器end():返回一个表示超过容器尾的迭代器push_back():将元素添加到矢量末尾erase():删除矢量中给定区间的元素insert():插入元素for_each():将被指向的函数应用于容器区间中的各个元素。可以用它代替for循环random_shuffle():随机排列该区间中的元素sort():对容器内容排序迭代器是一个广义指针,它可以是指针,也可以是一个可对其执行类似指针的操作(如 解除引用)。
17、超过结尾,它是一种迭代器,指向容器最后一个元素后面的那个元素。基于范围的for循环(C+11)double prices5=4.99,10.99,6.87,7.99,8.49); for(double x:prices)coutxendl;泛型编程为何使用迭代器/数组形式的搜索函数double* find_ar(double* ar.int n,double& val)for(int i=0;i p_n ext)if(start-item = val)return start;return 0;)/迭代器形式1typedef double* iterator;iterator find_ar(
18、iterator begin,iterator end.const double& valXiterator ar;for(ar=begin;ar!=end;ar+)if(*ar = val)return ar;return 0;)迭代器形式2iterator findl(iterator head,const double& val)iterator start;for(start=head;start!=0;+start)if(*start=val)return start;return 0;J泛型编程旨在使用同一个find函数来处理数组,链表或任何其他容器类型。即容器不 仅独立于容器中存
19、储的数据类型,而且独立于容器本身的数据结构。模板提供了存储在容器 中的数据类型的通用表示,因此还需要遍历容器中的值的通用表示,迭代器正式这样的通用 表 o首先,每个容器类定义了相应的迭代器类型。对于其中的某个类,迭代器可能是指针; 而对于另一个类,那么可能是对象。不管实现方式如何,迭代器都将提供所需的操作,如*和 + +。其次,每个容器类都有一个超尾标记,当迭代器递增到超越容器的最后一个值后,这 个值将被赋给迭代器。每个容器类都有benin()和end()方法,它们分别返回一个返回容器的 第一个元素和超尾位置的迭代器。每个容器类都使用+操作,让迭代器从指向第一个元素 逐步指向超尾位置,从而遍历
20、容器中的每一个元素。迭代器类型输入迭代器输入迭代器可被程序用来读取容器的信息。具体地说,对输入迭代器解除引用将使程序 能够读取容器的值,但不一定能让程序修改值。因此,需要输入迭代器的算算法将不会修改容器中的值。输入迭代器是单向迭代器,可以递增,但不能倒退。输出迭代器输出迭代器与输入迭代器相似,只是解除引用让程序能够修改容器值,而不能读取。正向迭代器正向迭代器只使用+运算符来遍历容器,所以它每次沿容器向前移动一个元素;然而, 与输入和输出迭代器不同的是,它总是按相同的顺序遍历一系列值。另外,将正向迭代器递 增后,仍然可以对前面的迭代器值解除引用,并可以得到相同的值。正向迭代器既可以使得 能够读取
21、数据和修改数据,也可以使得只能读取数据0双向迭代器双向迭代器具有正向迭代器所有特性,同时支持两种(前缀和后缀)递减运算符。list的迭代器是双向迭代器,因此不能使用基于随机访问迭代器的算法,但可以使用基 于要求较低的迭代器的算法。随机访问迭代器有些算法(如标准排序和二分检索)要求能够直接跳到容器中的任何一个元素,这叫随 机访问,需要随机访问迭代器。随机访问迭代器具有双向迭代器的所有特性,同时添加了支 持随机访问的操作(如指针增加运算)和用于对元素进行排序的关系运算符。vector的迭代器是随机访问迭代器,它允许使用基于任何迭代器类型的算法,随机访问 迭代器具有所有迭代器的功能。其他有用的迭代器
22、反向迭代器vector的rbegin()和rend(),前者返回一个指向超尾的反向迭代器,后者返回一个指向 第一个元素的反向迭代器,因为对迭代器执行递增操作将导致它被递减,所以可以使用它来 反向显示内容。插入迭代器插入将添加新元素,而不会覆盖已有的数据,并使用自动内存分配来确保能够容纳新的 信息。back_insert_iterator将元素插入到容器尾部,而front_insert_iterator将元素插入到容 器的前端。最后,insert_iterator将元素插入到inserjiterator构造函数的参数指定的位置前 面。这3个插入迭代器都是输出容器概念的模型。这些迭代器将容器类型作
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ Primer Plus学习笔记 Plus 学习 笔记
限制150内