C++Primer中文版学习笔记_第1页
C++Primer中文版学习笔记_第2页
C++Primer中文版学习笔记_第3页
C++Primer中文版学习笔记_第4页
C++Primer中文版学习笔记_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、调用GNU或微软编译器调用GNU编译器的默认命令是g+:$g+-oprog1微软编译器采用命令cl来调用:C:directory>cl-GXacmpc2编译器搭配下面是pc2配置:(以vc为编译环境)配置环境变量:jdk设置:;vc编译器设置:path=C:ProgramFilesMicrosoftVisualStudioVC98Bin;lib=C:ProgramFilesMicrosoftVisualStudioVC98Lib;include=C:ProgramFilesMicrosoftVisualStudioVC98include环境变量配置完成之后,设置下pc2就ok了!pc2设

2、置如下:compilecomline:mainfileExecutableFilename::basename.exeprogramexecutioncommandline:basename.exe做到这些配置,基本上编译就不成问题了!注意,期间可以需要到C:ProgramFilesMicrosoftVisualStudioCOMMONTools路径下拷贝到C:ProgramFilesMicrosoftVisualStudioVC98Bin;!这个自己调试就Ok了!访问main函数的返回值的方式和系统有关。不论UNIX还是Windows系统,执行程序后,必须发出一个适当的echo命令。UNIX

3、系统中,通过键入如下命令获取状态:$echo$要在Windows系统下查看状态,键入C:directory>echo%ERRORLEVEL%再谈编译编译器的部分工作是寻找程序代码中的错误。编译器不能查出程序的意义是否正确,但它可以查出程序形式上的错误。下面是编译器能查出的最普遍的一些错误。1、语法错误。程序员犯了C+语言中的语法错误。下面代码段说明常见的语法错误;每个注释描述下一行的错误。<<std二endl:<<std二endl;<<std二endl;c源文件,较有效的方法是只重新编译修改过的文件。大多数编译器都提供了分别编译每一个文件的方法。通常这

4、个过程产生.0文件,.0扩展名暗示该文件含有目标代码。编译器允许我们把目标文件链接在一起以形成可执行文件。我们所使用的系统可以通过命令名CC调用编译。因此可以按以下方式编译程序:$CC-c#generates$CC-c#generates$CC#bydefaultgenerates;#somecompilersgenerate#putstheexecutablein$CC-omain头文件用于声明而不是用于定义因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知道的const对象和inline函数。这些实

5、体可在多个源文件中定义,只要每个源文件中的定义是相同的。一些const对象定义在头文件中当该const变量是用常量表达式初始化时,可以保证所有的变量都有相同的值。但是在实践中,大部分的编译器在编译时都会用相应的常量表达式替换这些const变量的任何使用。所以,在实践中不会有任何存储空间用于存储用常量表达式初始化的const变量。可在头文件中定义。如果const变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其他的变量一样,该const变量应该在一个源文件中定义并初始化。应在头文件中为它添加extern声明,以使其能被多个文件共享。下列声明和定义哪些应该放在头文件中哪些应该放在

6、源文件中请解释原因。(a) intvar;(b) constdoublepi=;(c) externinttotal=255;(d) constdoublesq2=squt;【解答】(a) 、(c)、(d)应放在源文件中,因为(a)和(c)是变量定义,定义通常应放在源文件中。(d)中的const变量sq2不是用常量表达式初始化的,所以也应该放在源文件中。(b) 中的const变量pi是用常量表达式初始化的,应该放在头文件中。不使用命名空间#include<iostream>intmain()intsum=0,val=1;mpty()如果s为空用,则返回true,否则返回false。

7、厂()返回s中字符的个数sn返回s中位置为n的字符,位置从0开始计数s1+s2把si和s2连接成一个新字符串,返回新生成的字符用s1=s2把si内容替换为s2的副本rv1=v2比较v1与v2的内容,相等则返回true,否则返回falseL!=,<,<=,>,and>=保持这些操作符惯有的含义string二size_type类型从逻辑上来讲,size()成员函数似乎应该返回整形数值,或如节“建议”中所述的无符号整数。但事实上,size操作返回的是string:size_type类型的值。我们需要对这种类型做一些解释。任何存储string的size操作结果的变量必须size

8、的返回值赋给为string:size_type类型。特别重要的是,不要把一个int变量。和字符串字面值的连接当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的:stringsi="hello"而在头文件名前加了c表示这个头文件源自C标准库。因此,cctype与文件的内容是一样的,只是采用了更适合C+附序的形式。特别地,cname头文件中定义的名字都定义在命名空间std内,而.h版本中的名字却不是这样。通常,C+程序中应采用cname这种头文件的版本,而不采用版本,这样,标准库中的名字在命名空间std中保持一致。使用.h

9、版本会给程序员带来负担,因为他们必须记得哪些标准库名字是从C继承来的,而哪些是C+所特有的。标准库vector类型vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和string对象一样,标准库将负责管理与存储元素相关的内存。我们把vector称为容器,是因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。vector是一个类模板(classtemplate)。使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。因此,我们可以定义保存string对象的vector,或保存int值的vector,又或是保存自定义的类类型对象(如Sales_item

10、s对象)的vector。声明从类模板产生的某种类型的对象,需要提供附加信息,信息的种类取决于模板。以vector为例,必须说明vector保存何种对象的类型,通过将类型放在类型放在类模板名称后面的尖括号中来指定类型:vector<int>ivec;.*/ ivalpi2=0;intmain()inti=0,j2=0,1;intk10=0,1,2,3,4,5,6,7,8,9;printValues(&i);.第二个形参argv是一个C风格字符串数组。第一个形参argc则用于传递该数组中字符串的个数。由于第二个参数是一个数组,主函数main也可以这样定义:intmain(int

11、argc,char*argv).prog-d-oofiledata0当将实参传递给主函数main时,argv中的第一个字符串(如果有的话)通常是程序的名字。接下来的元素将额外的可选字符串传递给主函数main。以前面的命令行为例,argc应设为5,argv会保存下面几个C风格字符串:argv0=argv1=argv2=argv3=argv4="prog""-d""-o""ofile""data0"静态局部对象一个变量如果位于函数的作用域内,但生命期跨越了这个函数的多次调用,这种变量往往很有用。则应

12、该将这样的对象定义为static(静态的)。static局部对象确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化。这种对象一旦被创建,在程序结束前都不会撤销。当定义静态局部对象的函数结束时,静态局部对象不会撤销。在该函数被多次调用的过程中,静态局部对象会持续存在并保持它的值。考虑下面的小例子,这个函数计算了自己被调用的次数:size_tcount_calls()staticsize_tctr=0;.输出缓冲区的管理每个IO对象管理一个缓冲区,用于存储程序读写的数据。如有下面语句:os<<"pleaseenteravalue:"1. 程序正常结束。作

13、为main返回工作的一部分,将清空所有输出缓冲区。2. 在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新。3. 用操纵符(第节)显式地刷新缓冲区,例如行结束符endl。4. 在每次输出操作执行完后,用unitbuf操作符设置流的内部状态,从而清空缓冲区。5. 可将输出流与输入流关联(tie)起来。在这种情况下,在读输入流时将刷新其关联的输出缓冲区。输出缓冲区的刷新们的程序已经使用过endl操纵符,用于输出一个换行符并刷新缓冲区。除此之外,C+语言还提供了另外两个类似的操纵符。第一个经常使用的flush,用于刷新流,但不在输出中添加任何字符。第二个则是比较少用

14、的ends,这个操纵符在缓冲区中插入空字符null,然后后刷新它:cout<<"hi!"<<flush;在word_count中查找键为Anna的元素,没有找到。2. 将一个新的键值对插入到word_count中。它的键是conststring类型的对象,保存Anna而它的值则采用值初始化,这就意味着在本例中值为0。3. 将这个新的键值对插入到word_count中。4. 读取新插入的元素,并将它的值赋为1。使用下标访问map与使用下标访问数组或vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新元素,它的键即为该下标值。

15、下标操作符返回左值。它返回的左值是特定键所关联的值。可如下读或写元素:cout<<word_count"Anna"*Takestwoarguments:Thefirstisnameofthewordtransformationfile*Thesecondisnameoftheinputtotransform*/intmain(intargc,char*argv)list容器特有的操作(lst2)(lst2,comp)将lst2的兀素合并到1st中。这两个list谷器对象都必须排序。lst2中的元素将被删除。合并后,lst2为空。返回void尖型。第一个版本使用&

16、lt;操作符,而第二个版本则使用comp指定的比较运算(val)(unaryPred)调用删除所有等于指定值或使指定的谓词函数返回非零值的元素。返回void类型()反向排列lst中的元素对lst中的兀系排序(iter,lst2)(iter,lst2,iter2)(iter,beg,end)将lst2的元素移到lst中迭代器iter指向的元素前面。在lst2中删除移出的元素。第一个版本将lst2的所有元素移到lst中;合并后,lst2为空。lst和lst2不能是同一个list对象。第二个版本只移动iter2所指向的元素,这个元素必须是lst2中的元素。在这种情况中,lst和lst2可以是同一个l

17、ist对象。也就是说,可在一个list对象中使用splice运算移动一个元素。第三个版本移动迭代器beg和end标记的氾围内的兀素。beg和end照例必须指个有效的范围。这两个迭代器可标记任意list对象内的范围,包括lst。当它们指定lst的一段范围时,如果iter也指向这个范围的一个元素,则该运算未定义。()(binaryPred)调用erase删除同一个值的连续副本。第一个版本使用=操作符判断元素是否相等;第二个版本则使用指定的谓词函数实现判断类的定义和声明Sales_item类:classSales_itempublic:et('#');个语句等价于:(4,0);(&#

18、39;#');返回*this在单个表达式中调用move和set操作时,每个操作必须返回一个引用,该引用指向执行操作的那个对象:classScreenpublic:et('#').display(cout);这个用法暗示了display应该返回一个Screen引用,并接受一个ostream引用。如果display是一个const成员,则它的返回类型必须是constScreen&。不幸的是,这个设计存在一个问题。如果将display定义为const成员,就可以在非const对象上调用display,但不能将对display的调用嵌入到一个长表达式中。下面的代码将是非法的:ScreenmyScreen;et('*');问题在于这个表达式是在由display返回的对象上运行set。该对象是const,因为display将其对象作为const返回。我们不能在const对象上调用set。基于const的重载为了解决这个问题,我们必须定义两个display操作:一个是const,另一个不是const。基于成员函数是否为const,可以重载一个成员函数;同样地,基于一个指针形参是否指向const(第节),可以重载一个函数。const对象只能使用const成员。非const对象可以使用任一成员,但非const版本是一个更好的匹配。在此,我们将定义一个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论