PHP资源站-WEB前端技术交流社区

 找回密码
 立即注册
查看: 1248|回复: 6

[PDF] C++Primer中文版第5版

[复制链接]

193

主题

234

帖子

1061

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1061
发表于 2016-10-30 15:28:29 | 显示全部楼层 |阅读模式

C++Primer中文版

C++Primer中文版

C++Primer中文版第5版高清pdf,这本久负盛名的C++经典教程,时隔八年之久,终迎来的重大升级。除令全球无数程序员从中受益,甚至为之迷醉的——C++ 大师 Stanley B. Lippman 的丰富实践经验,C++标准委员会原负责人Josée Lajoie 对C++标准的深入理解,以及C++ 先驱 Barbara E.Moo在C++教学方面的真知灼见外,更是基于全新的C++11标准进行了全面而彻底的内容更新。非常难能可贵的是,所有示例均全部采用C++11标准改写,这在经典升级版中极其罕见——充分体现了C++语言的重大进展及其全面实践。书中丰富的教学辅助内容、醒目的知识点提示,以及精心组织的编程示范,C++ Primer中文版第5版在C++领域的权威地位更加不可动摇。无论是初学者入门,或是中、高级程序员提升,C++ Primer中文版第5版均为不容置疑的首选。

C++ Primer中文版第5版高清PDF截图:

C++Primer中文版第5版

C++Primer中文版第5版

提取码:6rjj 
状态:您未购买  所需金币:15 (原价:15)金币
下载权限: 注册会员  VIP会员原价2折,查看详细  [充值金币]  [免费赚金币]

193

主题

234

帖子

1061

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1061
 楼主| 发表于 2016-11-18 02:55:17 | 显示全部楼层

第1 章 开始

内容

1 . 1 编写一个简单的C++程序... ............................... 2

1 . 2 初识输入输出....................... 5

1 . 3 注释简介............. 8

1 . 4 控制流......................................... 10

1 . 5 类简介............................................................17

1 . 6 书店程序..........................................................21

小结.................... 23

术语表 ................................................................ 23

本章介绍C++的大部分基础内容:类型、变量、表达式、语句及函数。在这个过程中,我们会简要介绍如何编译及运行程序。在学习完本章并认真完成练习之后,你将具备编写、编译及运行简单程序的能力。后续章节将假定你已掌握本章中介绍的语言特性,并将更详细地解释这些特性。

193

主题

234

帖子

1061

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1061
 楼主| 发表于 2016-11-18 03:16:01 | 显示全部楼层

学习一门新的程序设计语言的最好方法就是练习编写程序。在本章中,我们将编写一个程序来解决简单的书店问题。我们的书店保存所有销售记录的档案,每条记录保存了某本书的一次销售的信息(一册或多册)。每条记录包含三个数据项:

0-201-70353-X       4       24.99

第一项是书的ISBN 号(国际标准书号,一本书的唯一标识),第二项是售出的册数,最后一项是书的单价。有时,书店老板需要查询此档案,计算每本书的销售量、销售额及平均售价。为了编写这个程序,我们需要使用若干C++的基本特性。而且,我们需要了解如何编译及运行程序。

虽然我们还没有编写这个程序,但显然它必须

•定义变量

•进行输入和输出

•使用数据结构保存数据

•检测两条记录是否有相同的工SBN

•包含一个循环来处理销售档案中的每条记录

我们首先介绍如何用C++来解决这些子问题,然后编写书店程序。

1.1 编写一个简单的C+ + 程序

每个C++程序都包含一个或多个函数(function) , 其中一个必须命名为main。操作系统通过调用main 来运行C++程序。下面是一个非常简单的main 函数,它什么也不干,只是返回给操作系统一个值:

int main()

{

      return 0;

}

一个函数的定义包含四部分:返回类型(return type)、函数名( function name)、一个括号包围的形参列表( parameter list,允许为空)以及函数体(function body)。虽然main函数在某种程度上比较特殊,但其定义与其他函数是一样的。

在本例中,main 的形参列表是空的(()中什么也没有)。6.2.5节(第196页)将会讨论main 的其他形参类型。main 函数的返回类型必须为int , 即整数类型。int 类型是一种内置类型(built-intype) , 即语言自身定义的类型。

函数定义的最后一部分是函数体,它是一个以左花括号( curly brace) 开始,以右花括号结束的语句块( block of statements):

      return 0;

}

这个语句块中唯一的一条语句是return ,它结束函数的执行。在本例中, return还会向调用者返回一个值。当return 语句包括一个值时,此返回值的类型必须与函数的返回类型相容。在本例中,ma in 的返回类型是i n t , 而返回值0 的确是一个i n t 类型的值。

请注意,r e t u r n 语句末尾的分号。在C+ + 中,大多数C++语句以分号表示结束。它们很容易被忽略,但如果忘记了写分号,就会导致莫名其妙的编译错误。

在大多数系统中,main 的返回值被用来指示状态。返回值0 表明成功,非0 的返回值的含义由系统定义,通常用来指出错误类型。

重要概念:类型

类型是程序设计最基本的概念之一,在本书中我们会反复遇到它。一种类型不仅定义了数据元素的内容,还定义了这类数据上可以进行的运算。

程序所处理的数据都保存在变量中, 而每个变量都有自己的类型。如果一个名为V的变量的类型为T, 我们通常说“V 具有类型T”,或等价的,“V 是一个T 类型变量”。

1.1.1编译、运行程序

编写好程序后,我们就需要编译它。如何编译程序依赖于你使用的操作系统和编译器。你所使用的特定编译器的相关使用细节,请查阅参考手册或询问经验丰富的同事。

很多PC机上的编译器都具备集成开发环境( Integrated Developed Environment,IDE),将编译器与其他程序创建和分析工具包装在一起。在开发大型程序时,这类集成环境可能是非常有用的工具,但需要一些时间来学习如何高效地使用它们。学习如何使用这类开发环境已经超出了本书的范围。

大部分编译器,包括集成IDE的编译器,都会提供一个命令行界面。除非你己经了解IDE, 否则你会觉得借助命令行界面开始学习C++还是很容易的。这种学习方式的好处是,可以先将精力集中于C++语言本身(而不是一些开发工具),而且,一旦你掌握了语言,IDE通常是很容易学习的。

程序源文件命名约定

无论你使用命令行界面或者IDE, 大多数编译器都要求程序源码存储在一个或多个文件中。程序文件通常被称为源文件(source file)。在大多数系统中,源文件的名字以一个后缀为结尾,后缀是由一个句点后接一个或多个字符组成的。后缀告诉系统这个文件是一个C++程序。不同编译器使用不同的后缀命名约定,最常见的包括.c c 、.c x x 、.cpp、.cp 及.C。

从命令行运行编译器

如果我们正在使用命令行界面,那么通常是在一个控制台窗口内(例如UNIX系统中的外壳程序窗口或者Windows系统中的命令提示符窗口)编译程序。假定我们的main程序保存在文件progl .cc 中,可以用如下命令来编译它

$ CC progl.cc

其中,CC是编译器程序的名字,$是系统提示符。编译器生成一个可执行文件。Windows系统会将这个可执行文件命名为progl .exe 。UNIX 系统中的编译器通常将可执行文件命名为a .out。

为了在Windows系统中运行一个可执行文件,我们需要提供可执行文件的文件名,可以忽略其扩展名.exe:

$ progl

在一些系统中,即使文件就在当前目录或文件夹中,你也必须显式指出文件的位置。在此情况下,我们可以键入

$ .\progl

"," 后跟一个反斜线指出该文件在当前目录中。

为了在UNIX系统中运行一个可执行文件,我们需要使用全文件名,包括文件扩展名:

$ a.out

如果需要指定文件位置,需要用一个后跟一个斜线来指出可执行文件位于当前目录中。

$ ./a.out

访问main的返回值的方法依赖于系统。在UNIX和Windows系统中,执行完一个程序后,都可以通过echo命令获得其返回值。在UNIX系统中,通过如下命令获得状态:

$ echo $?

在Windows系统中查看状态可键入:

$ echo %ERRORLEVEL%

193

主题

234

帖子

1061

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1061
 楼主| 发表于 2016-11-18 03:36:48 | 显示全部楼层

运行GNU或微软编译器

在不同操作和编译器系统中,运猶C++编译器的命令也各不柑同。最常用的编译器是GNU编译器和微软Visual Studio编译器。默认情况下,运行GNU编译器的命令是g++:

$ g++ -o progl progl.cc

此处,$是系统提示符。-o progl是编译器参数,指定了可执行文件的文件名。在不同的操作系统中,此命令生成一个名为progl或progl .exe的可执行文件。在UNIX系统中,可执行文件没有后缀;在Windows系统中,后缀为.exe。如果省略了-o progl参数,在UNIX系统中编译器会生成一个名为a.out的可执行文件,在Windows系统中则会生成一个名为a .exe的可执行文件(注意:根据使用的GNU编译器的版本,你可能需要指定-std=c++0x参数来打开对C++11的支持)。

运行微软Visual Studio 2010编译器的命令为cl:

C:\Users\me\Programs> cl /EHsc progl.cpp

此处,C :\Users\me\Programs>是系统提示符,\Users\me\Programs 是当前目录名(即当前文件夹)。命令c l 调用编译器,/EHsc是编译器选项,用来打开标准异常处理,微软编译器会自动生成一个可执行文件,其名字与第一个源文件名对应。可执行文件的文件名与源文件名相同,后缀为.exe。在此例中,可执行文件的文件名为progl.exe。

编译器通常都包含一些选项,能对有问题的程序结构发出警告。打开这些选项通常是一个好习惯。我们习惯在G N U 编译器中使用-Wall选项,在微软编译器中则使用/W4。更详细的信息请查阅你使用的编译器的参考手册。

1.1节练习

练习1.1:查阅你使用的编译器的文档,确定它所使用的文件命名约定。编译并运行第2 页的m a in 程序。

练习1.2:改写程序,让它返回-1。返回值- 1 通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理m a in 返回的错误标识。

193

主题

234

帖子

1061

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1061
 楼主| 发表于 2016-11-19 21:41:04 | 显示全部楼层

1 . 2 初识输入输出

C++语言并未定义任何输入输出(IO) 语句,取而代之,包含了一个全面的标准库(standard library) 来提供IO机制(以及很多其他设施)。对于很多用途,包括本书中的示例来说,我们只需了解IO库中一部分基本概念和操作。本书中的很多示例都使用了 iostream库。iostream库包含两个基础类型istream和ostream,分别表示输入流和输出流。一个流就是一个字符序列,是从IO设备读出或写入IO设备的。术语“流”(stream) 想要表达的是,随着时间的推移,字符是顺序生成或消耗的。

标准输入输出对象

标准库定义了 4 个IO对象。为了处理输入,我们使用一个名为c i n (发音为see-in)的i s t r e a m 类型的对象。这个对象也被称为标准输入(standardinput)。对于输出,我们使用一个名为cout (发音为see-out) 的o s t r e am 类型的对象。此对象也被称为标准输出( standard output)。标准库还定义了其他两个o s t r e am 对象,名为cerr和clog (发音分别为see-err和see-log)。我们通常用c e r r 来输出警告和错误消息,因此它也被称为标准错误( standard error)。而c l o g 用来输出程序运行时的一般性信息。

系统通常将程序所运行的窗口与这些对象关联起来。因此,当我们读取c i m 数据将从程序正在运行的窗口读入,当我们向c o u t、c e r r 和c l o g 写入数据时,将会写到同一个窗口。

一个使用IO库的程序

在书店程序中,我们需要将多条记录合并成单一的汇总记录。作为一个相关的,但更简单的问题,我们先来看一下如何将两个数相加。通过使用IO库,我们可以扩展main程序,使之能提示用户输入两个数,然后输出它们的和:

#include <iostream>

int main()

{

    std::cout « "Enter two numbers:" « std::endl;

    int vl =0, v2 = 0;

    std::cin » vl » v2;

    std::cout « "The sum of " « vl « " and " « v2

    << ’’ is " « vl + v2 << std: : endl;

    return 0;

}

这个程序开始时在用户屏幕打印

Enter two numbers:

然后等待用户输入。如果用户键入

3    7

然后键入一个回车,则程序产生如下输出:

The sum of 3 and 7 is 10

程序的第一行

#include <iostream>

告诉编译器我们想要使用i o s t r e a m 库。尖括号中的名字(本例中是io s t r e am ) 指出了一个头文件(header)。每个使用标准库设施的程序都必须包含相关的头文件。# include指令和头文件的名字必须写在同一行中。通常情况下,#include 指令必须出现在所有函数之外。我们一般将一个程序的所有# include 指令都放在源文件的开始位置。

向流写入数据

m a in 的函数体的第一条语句执行了一个表达式(expression)。在C++ 中,一个表达式产生一个计算结果,它由一个或多个运算对象和(通常是)一个运算符组成。这条语句中的表达式使用了输出运算符(<<) 在标准输出上打印消息:

std::cout « "Enter two numbers:" <<std::endl;

<<运算符接受两个运算对象:左侧的运算对象必须是一个o s t r e am 对象,右侧的运算对象是要打印的值。此运算符将给定的值写到给定的o s t r e am 对象中。输出运算符的计算结果就是其左侧运算对象。即,计算结果就是我们写入给定值的那个o s t r e am 对象。

我们的输出语句使用了两次<<运算符。因为此运算符返回其左侧的运算对象,因此第一个运算符的结果成为了第二个运算符的左侧运算对象。这样,我们就可以将输出请求连接起来。因此,我们的表达式等价于

(std::cout << "Enter two numbers:") << std::endl;

链中每个运算符的左侧运算对象都是相同的,在本例中是s t d ::cout 。我们也可以用两条语句生成相同的输出:

std::cout << "Enter two numbers:";

std::cout << std::endl;

第一个输出运算符给用户打印一条消息。这个消息是一个字符串字面值常量(stringliteral) , 是用一对双引号包围的字符序列。在双引号之间的文本被打印到标准输出。

第二个运算符打印endl,这是一个被称为操纵符(manipulator) 的特殊值。写入endl的效果是结束当前行,并将与设备关联的缓冲区(buffer) 中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅停留在内存中等待写入流。

使用标准库中的名字

细心的读者可能会注意到这个程序使用了 std : :cout 和std : :endl, 而不是直接的cout 和endl。前缀s t d ::指出名字c o u t 和e n d l 是定义在名为std的命名空间(namespace) 中的。命名空间可以帮助我们避免不经意的名字定义冲突,以及使用库中相同名字导致的冲突。标准库定义的所有名字都在命名空间std中。

通过命名空间使用标准库有一个副作用:当使用标准库中的一个名字时,必须显式说明我们想使用来自命名空间s t d 中的名字。例如,需要写出s t d : :c o u t, 通过使用作用域运算符(::)来指出我们想使用定义在命名空间s t d 中的名字c o u t 。3.1节(第7 4 页)将给出一个更简单的访问标准库中名字的方法。

从流读取数据

在提示用户输入数据之后,接下来我们希望读入用户的输入。首先定义两个名为v1和v2 的变量(variable) 来保存输入:

int vl = 0, v2 = 0;

我们将这两个变量定义为i n t 类型,i n t 是一种内置类型,用来表示整数。还将它们初始化(initialize) 为0 。初始化一个变量,就是在变量创建的同时为它赋予一个值。

下一条语句是

std::cin >> vl >> v2;

它读入输入数据。输入运算符(>>) 与输出运算符类似,它接受一个i s t r e a m 作为其左侧运算对象,接受一个对象作为其右侧运算对象。它从给定的i s t r e a m 读入数据,并存入给定对象中。与输出运算符类似,输入运算符返回其左侧运算对象作为其计算结果。因此,此表达式等价于

(std::cin >>vl) >>v2;

由于此运算符返回其左侧运算对象,因此我们可以将一系列输入请求合并到单一语句中。本例中的输入操作从s t d : : c i n 读入两个值,并将第一个值存入v l ,将第二个值存入v 2 。换句话说,它与下面两条语句的执行结果是一样的

std::cin >> vl;

std::cin >> v2;

完成程序

剩下的就是打印计算结果了 :

std::cout « "The sum of " << vl << " and " << v2

<< " is " << vl + v2 << std::endl;

这条语句虽然比提示用户输入的打印语句更长,但原理上是一样的,它将每个运算对象打印在标准输出上。本例一个有意思的地方在于,运算对象并不都是相同类型的值。某些运算对象是字符串字面值常量,例如"The sum o f ”。其他运算对象则是i n t 值,如v l 、v 2 以及算术表达式v l +v 2 的计算结果。标准库定义了不同版本的输入输出运算符,来处理这些不同类型的运算对象。

1.2节练习

练习1.3:编写程序,在标准输出上打印H e llo , World。

练习1.4:我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符* ,来打印两个数的积。

练习1.5:我们将所有输出操作放在一条很长的语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中。

练习1.6:解释下面程序片段是否合法。

std::cout << "The sum of " << vl;

<< " and " << v2;

<< " is " << vl + v2 « std::endl;

如果程序是合法的,它输出什么?如果程序不合法,原因何在?应该如何修正?

0

主题

1

帖子

0

积分

注册会员

Rank: 6Rank: 6

积分
0
发表于 2016-12-31 11:40:41 | 显示全部楼层

0

主题

4

帖子

0

积分

注册会员

Rank: 6Rank: 6

积分
0
发表于 2017-4-20 09:31:39 | 显示全部楼层
:@:@:@:@
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|PHP资源站 |网站地图

Powered by Discuz! X3.2© 2001-2013 Comsenz Inc.