C++Primer中文版(第4版)学习笔记(注释).pdf
《C++Primer中文版(第4版)学习笔记(注释).pdf》由会员分享,可在线阅读,更多相关《C++Primer中文版(第4版)学习笔记(注释).pdf(60页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+Primer 中文版(第 4 版)学习笔记调用调用 GNU GNU 或微软编译器或微软编译器调用 GNU 编译器的默认命令是 g+:$g+prog1.cc-o prog1微软编译器采用命令 cl 来调用:C:directory cl-GX prog1.cppacm pc2acm pc2 编译器搭配编译器搭配下面是 pc2 配置:(以 vc 为编译环境)配置环境变量:jdk 设置:path=C:Program FilesJavajdk1.6.0bin;vc 编译器设置:path=C:Program FilesMicrosoft Visual StudioVC98Bin;lib=C:Progr
2、am FilesMicrosoft Visual StudioVC98Lib;include=C:ProgramFilesMicrosoftVisualStudioVC98include环境变量配置完成之后,设置下pc2 就 ok 了!pc2 设置如下:compile line:cl.exe:mainfile Executable Filename::basename.exe program execution command line:basename.exe做到这些配置,基本上编译就不成问题了!注意,期间可以需要到 C:ProgramFilesMicrosoft Visual Studio
3、COMMONTools 路径下拷贝 mspdb60.dll 到 C:ProgramFilesMicrosoft Visual StudioVC98Bin;!这个自己调试就 Ok 了!访问 main 函数的返回值的方式和系统有关。不论 UNIX 还是 Windows 系统,执行程序后,必须发出一个适当的 echo 命令。UNIX 系统中,通过键入如下命令获取状态:$echo$?要在 Windows 系统下查看状态,键入 C:directory echo%ERRORLEVEL%再谈编译再谈编译编译器的部分工作是寻找程序代码中的错误。编译器不能查出程序的意义是否正确,但它可以查出程序形式上的错误。下
4、面是编译器能查出的最普遍的一些错误。1、语法错误。程序员犯了 C+语言中的语法错误。下面代码段说明常见的语法错误;每个注释描述下一行的错误。/error:missing)in parameter list formain int main(/error:used colon,not a semicolon afterendl std:cout Read each file.std:endl:/error:missing quotes around stringliteral std:cout Update master.std:endl;/ok:no errors on this line s
5、td:cout Write new master.std:endl;/error:missing;on return statement return 0 2、类型错误。C+中每个数据项都有其相关联的类型。例如,值 10 是一个整数。用双引号标注起来的单词“hello”是字符串字面值。类型错误的一个实例是传递了字符串字面值给应该得到整型参数的函数。3、声明错误。C+程序中使用的每个名字必须在使用之前声明。没有声明名字通常会导致错误信息。最常见的两种声明错误,是从标准库中访问名字时忘记使用“std:”,以及由于疏忽而拼错标识符名:#include int main()int v1,v2;std:
6、cin v v2;/error:uses v not v1 /cout not defined,should be std:cout cout v1+v2 std:endl;return 0;错误信息包含行号和编译器对我们所犯错误的简要描述。按错误报告的顺序改正错误是个好习惯,通常一个错误可能会产生一连串的影响,并导致编译器报告比实际多得多的错误。最好在每次修改后或最多改正了一些显而易见的错误后,就重新编译代码。这个循环就是众所周知的编辑编译调试。从键盘输入文件结束符从键盘输入文件结束符操作系统使用不同的值作为文件结束符。Windows 系统下我们通过键入controlz同时键入“ctrl”键
7、和“z”键,来输入文件结束符。Unix 系统中,包括 Mac OSX 机器,通常用 controld。标准库的头文件用尖括号 括起来,非标准库的头文件用双引号 括起来。我们能将值 20 定义成下列三种形式中的任意一种:20 /decimal 024 /octal 0 x14 /hexadecimal以 0(零)开头的字面值整数常量表示八进制,以 0 x 或 0X 开头的表示十六进制。定义长整型时,应该使用大写字母 L。小写字母 l 很容易和数值 1 混淆。类似地,可通过在数值后面加U或u定义unsigned类型。使用科学计数法时,指数用E或者e表示。默认的浮点字面值常量为double类型。在数
8、值的后面加上F或f表示单精度。同样加上L或者l表示扩展精度非打印字符的转义序列非打印字符的转义序列newline换行符vertical tab纵向制表符n horizontal tab t水平制表符v backspace退格符fbcarriage return r formfeed回车符alert(bell)报警(响铃)符进纸符a backslash反斜线question mark疑问号double quote双引号?single quote单引号我们可以将任何字符表示为以下形式的通用转义字符:ooo这里 ooo 表示三个八进制数字,这三个数字表示字符的数字值。下面的例子是用 ASCII 码字
9、符集表示字面值常量:7(bell)12(newline)40(blank)0(null)062(2)115(M)字符0通常表示“空字符(null character)”,我们将会看到它有着非常特殊的意义。同样也可以用十六进制转义字符来定义字符:xdddC+的格式非常自由。特别是有一些地方不能插入空格,其中之一是在单词中间。特别是不能在单词中间断开一行。但可以通过使用反斜线符号巧妙实现:/ok:A before a newline ignores the line break std:cou t Hi st d:endl;等价于 std:cout Hi std:endl;可以使用这个特性来编写长
10、字符串字面值:/multiline string literal std:cout a multi-line string literal using a backslash std:endl;return 0;注意反斜线符号必须是该行的尾字符不允许有注释或空格符。同样,后继行行首的任何空格和制表符都是字符串字面值的一部分。正因如此,长字符串字面值的后继行才不会有正常的缩进。C+C+关键字关键字asmautoboolbreakcasecatchcharclassconstdodoubleifinlinereturnshortsignedsizeofstatictrytypedeftypeidt
11、ypenameuniondynamic_cast intelseenumexplicitexportexternfalselongmutablenamespacenewoperatorprivateprotectedpublicregisterstatic_cast unsignedstructswitchtemplatethisthrowtrueusingvirtualvoidvolatilewchar_twhileconst_cast floatcontinuedefaultdeleteforfriendgotoreinterpret_castC+C+操作符替代名操作符替代名andbita
12、nd compl not_eq or_eq xor_eqorxorand_eq bitornotC+支持两种初始化变量的形式:复制初始化复制初始化和直接初始化直接初始化。复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中:int ival(1024);/direct-initialization int ival=1024;/copy-initialization初始化置类型的对象只有一种方法:提供一个值,并且把这个值复制到新定义的对象中。对置类型来说,复制初始化和直接初始化几乎没有差别。对类类型的对象来说,有些初始化仅能用直接初始化完成。要想理解其中缘由,需要初步了解类是如何控制
13、初始化的。变量初始化规则变量初始化规则置类型变量的初始化置类型变量的初始化使用未初始化的变量是常见的程序错误,通常也是难以发现的错误。虽然许多编译器都至少会提醒不要使用未初始化变量,但是编译器并未被要求去检测未初始化变量的使用。而且,没有一个编译器能检测出所有未初始化变量的使用。有时我们很幸运,使用未初始化的变量导致程序在运行时突然崩溃。一旦跟踪到程序崩溃的位置,就可以轻易地发现没有正确地初始化变量。但有时,程序运行完毕却产生错误的结果。更糟糕的是,程序运行在一部机器上时能产生正确的结果,但在另外一部机器上却不能得到正确的结果。添加代码到程序的一些不相关的位置,会导致我们认为是正确的程序产生错
14、误的结果。建议每个置类型的对象都要初始化。虽然这样做并不总是必需的,但是会更加容易和安全,除非你确定忽略初始化式不会带来风险。类类型变量的初始化类类型变量的初始化每个类都定义了该类型的对象可以怎样初始化。类通过定义一个或多个构造函数来控制类对象的初始化。如果定义某个类的变量时没有提供初始化式,这个类也可以定义初始化时的操作。它是通过定义一个特殊的构造函数即默认构造函数默认构造函数来实现的。这个构造函数之所以被称作默认构造函数,是因为它是“默认”运行的。如果没有提供初始化式,那么就会使用默认构造函数。不管变量在哪里定义,默认构造函数都会被使用。变量的声明和定义变量的声明和定义变量的定义定义用于为
15、变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。声明声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用 extern 关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字 extern:extern int i;/declares but does not define i int i;/declares and defines iextern 声明不是定义,也不分配存储空间。事实上,它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。只有当声明也是定义时,声
16、明才可以有初始化式,因为只有定义才分配存储空间。初始化式必须要有存储空间来进行初始化。如果声明有初始化式,那么它可被当作是定义,即使声明标记为 extern:extern double pi=3.1416;/definition虽然使用了 extern,但是这条语句还是定义了 pi,分配并初始化了存储空间。只有当 extern 声明位于函数外部时,才可以含有初始化式。因为已初始化的 extern 声明被当作是定义,所以该变量任何随后的定义都是错误的:extern double pi=3.1416;/definition double pi;/error:redefinition of pi同样
17、,随后的含有初始化式的 extern 声明也是错误的:extern double pi=3.1416;/definition extern double pi;/ok:declaration not definition extern double pi=3.1416;/error:redefinition of pi声明和定义之间的区别可能看起来微不足道,但事实上却是举足轻重的。在 C+语言中,变量必须且仅能定义一次,而且在使用变量之前必须定义或声明变量。任何在多个文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定
18、义)。下列程序段将会输出什么?int i=100,sum=0;for(int i=0;i!=10;+i)sum+=i;std:cout i sum std:endl;【解答】输出为:100 45for 语句中定义的变量i,其作用域仅限于for 语句部。输出的i 值是for 语句之前所定义的变量 i 的值。constconst因为常量在定义后就不能被修改,所以定义时必须初始化:const std:string hi=hello!;/ok:initialized const int i,j=0;/error:i is uninitialized const引用引用引用必须用与该引用同类型的对象初始
19、化:int ival=1024;int&refVal=ival;/ok:refVal refers to ival int&refVal2;/error:a reference must be initialized int&refVal3=10;/error:initializer must be an object因为引用只是它绑定的对象的另一名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上:constconst 引用引用constconst 引用引用是指向 const 对象的引用:const int ival=1024;const int&refVal=ival;/ok:b
20、oth reference and object areconst int&ref2=ival;/error:non const reference to aconst object可以读取但不能修改 refVal,因此,任何对 refVal 的赋值都是不合法的。这个限制有其意义:不能直接对 ival 赋值,因此不能通过使用 refVal 来修改ival。类定义类定义使用使用structstruct关键字关键字C+支持另一个关键字 struct,它也可以定义类类型。struct 关键字是从 C 语言中继承过来的。用 class 和 struct 关键字定义类的唯一差别在于默认访问级别:默认情况
21、下,struct 的成员为 public,而 class 的成员为 private。class Sales_item public:/operations on Sales_item objects will go here private:std:string isbn;unsigned units_sold;double revenue;struct Sales_item /no need for public label,members are public by default /operations on Sales_item objects private:std:string i
22、sbn;unsigned units_sold;double revenue;编译和多个源文件编译和多个源文件我们可以按以下方式编译这两个文件:$CC-c main.cc Sales_item.cc#by default generates a.exe#some compilers generate a.out#puts the executable in main.exe$CC-c main.cc Sales_item.cc-o main其中$是我们的系统提示符,#开始命令行注释。现在我们可以运行可执行文件,它将运行我们的 main 程序。如果我们只是修改了一个.cc 源文件,较有效的方法是
23、只重新编译修改过的文件。大多数编译器都提供了分别编译每一个文件的方法。通常这个过程产生.o文件,.o 扩展名暗示该文件含有目标代码。编译器允许我们把目标文件在一起以形成可执行文件。我们所使用的系统可以通过命令名 CC 调用编译。因此可以按以下方式编译程序:$CC-c main.cc#generates main.o$CC-c Sales_item.cc#generates Sales_item.o$CC main.o Sales_item.o#by default generates a.exe;#some compilers generate a.out#puts the executabl
24、e in main.exe$CC main.o Sales_item.o-o main头文件用于声明而不是用于定义头文件用于声明而不是用于定义因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。对于头文件不应该含有定义这一规则,有三个例外有三个例外。头文件可以定义类、值在编译时就已知道的const对象和inline函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。一些一些constconst对象定义在头文件中对象定义在头文件中当该 const 变量是用常量表达式初始化时,可以保证所有的变量都有相同的值。但是在实践中,大部分的编译器在编译时都会用相应的常量表达式替换这
25、些const 变量的任何使用。所以,在实践中不会有任何存储空间用于存储用常量表达式初始化的 const 变量。可在头文件中定义。如果 const 变量不是用常量表达式初始化,那么它就不应该在头文件中定义。相反,和其他的变量一样,该 const 变量应该在一个源文件中定义并初始化。应在头文件中为它添加 extern 声明,以使其能被多个文件共享。下列声明和定义哪些应该放在头文件中?哪些应该放在源文件中?请解释原因。(a)int var;(b)const double pi=3.1416;(c)extern int total=255;(d)const double sq2=squt(2.0);【
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Primer 中文版 学习 笔记 注释
限制150内