The Complete C++ Training Course chapter 1

《C++大学教材速读 》第一章计算机和 C++简介

编程语言与计算机基础

计算机组成单元

如果不考虑外表上的不同,计算机都可以视为由输入单元(input unit)、输出单元(output unit)、内存单元(memory unit)、算术逻辑单元(arithmetic and logic unit)、中央处理器(central processing unit)、辅助存储单元(secondary storage unit)

数据的层次结构

由位到字符,再到字段,...,层次越来越庞大,结构也越来越复杂。

graph LR;
    高级语言 -- 编译器 --> 机器语言;

解释型高级语言(PHP、JavaScript)

graph LR;
    高级语言 -- 解释器 --> 机器语言;

C++面向对象

C++和C

C++是对C的一个扩展,由贝尔实验室的Bjarne Stroustrup在1979年推出。最初这种语言被称作“带类的C(Cwith Classes)”,而在20世纪80年代早期改名为C++。C++提供了许多使C语言“焕然一新”的特性。不过更重要的是,C++提供了面向对象编程(object-oriented programming)的能力。

C++的学习内容

C++程序由一系列称为类和函数的构件组成。大家可以编写构成一个C++程序所需要的每个构件。不过,大多数C++程序员都会利用C++标准库(C++Standard Library)所提供的丰富而现成的类和函数。所以,要想了解“C++世界”,实际上需要学习两方面的知识:一是学习C++语言本身;二是学习使用C++标准库所提供的各种类和函数。

C++的对象概念

我们在第3章将看到的对象,更确切地说应该是对象来自的类,本质上是可重用的软件组件。存在数据对象、时间对象、音频对象、视频对象、汽车对象、人类对象等对象。实际上,几乎所有的名词都能合理地用属性(例如名称、颜色和大小等)和行为(例如计算、移动和通信等)表示成软件对象。软件开发者发现,可能与早期的开发方法相比,采用模块化的、面向对象的设计与实现方法,可以显著提高软件开发小组的生产效率——面向对象的程序往往更易于理解、纠正和修改。小汽车作为对象,通常,一辆小汽车是从工程图纸开始的,它们类似于设计房屋用的蓝图。这些设计图中包含了使车加速的加速器踏板的设计。对于驾驶员来说,加速器踏板向他隐藏了使小汽车实际加速的复杂内部结构,就像刹车踏板隐藏了使小汽车减速的内部结构、方向盘隐藏了使小汽车方向变动的内部结构一样。

成员函数和类

现在,我们以小汽车的例子继续介绍一些关键的面向对象编程概念。执行程序中的任务需要成员函数。成员函数拥有实际执行其任务的程序语句。它向用户隐藏了这些语句,就如同小汽车的加速器踏板向驾驶员隐藏了使小汽车加速的复杂内部结构一样。在C++中,我们创建称为类的程序单元。类包含了执行该类自己任务的成员函数集合。类在概念上与小汽车工程图纸相似,后者包含了加速器踏板、方向盘等装置的设计。

实例化

就像在你能够实际驾驶一辆小汽车之前,必须得有人根据工程图纸制造出它一样,我们也必须在程序可以执行一个类的方法所定义的任务之前,由这个类创建一个对象。此构建对象的过程称作实例化(instantiation)。于是,一个对象也叫作它的类的一个实例。

graph LR;
    类/蓝图 -- 实例化 --> 对象/实物;

重用

既然可以多次重用同一份小汽车工程图纸制造出许多辆小汽车,那么我们也可以多次重用一个类去构建很多的对象。构建新的类和程序的时候,重用已有的类可以节省时间和精力。重用还有助于构建更加可靠和有效的系统,因为已有的类和组件常常经过了大量的测试、调试和性能改进。

消息和成员函数调用

在驾驶一辆小汽车的时候,踩压它的加速器踏板意味着向小汽车发送了一条执行加速任务的消息。类似地,可以向对象发送消息。每条消息都被实现为一次成员函数调用,告诉对象的成员函数去执行它的任务。例如,程序可能会调用一个特别的银行账户对象的存款成员函数来增加该账户的余额。

属性和数据成员

一辆小汽车除了有能力执行任务外,它还具有许多属性,例如颜色、门的数目、油箱中的汽油量、当前的速度和驾驶的总里程记录(也就是小汽车里程表的读数)等。和小汽车的任务能力一样,小汽车的这些属性也作为小汽车工程图纸中的一部分设计被表示出来,例如包括里程表和燃料计量器等。当你驾驶实际的小汽车时,这些属性总是与小汽车相伴的。每辆小汽车维护着自己的属性。例如,每辆小汽车知道自己油箱中的油量还有多少,却对其他小汽车的油量一无所知。

封装

类将属性和成员函数封装(encapsulate)(也就是打包)在对象中——一个对象的属性和成员函数是密切相关的。对象之间可以进行相互通信,但是通常不允许它们知道其他对象是怎么实现的一—也就是说,实现的细节隐藏在对象自身中。我们将看到,这种信息隐藏(information hiding)对良好的软件工程是至关重要的。

继承

我们可以通过继承(inheritance)快速和方便地创建一个新的对象类——该新的类吸收已有类的特性,有可能定制和添加它自己独特的特性。在前面的小汽车类比中,“敞篷车”类的一个对象当然是更一般性的类“小汽车”的一个对象,只是更特殊的是,它的车顶能张能收。

面向对象分析与设计(OOAD)

如果分析和设计系统是从面向对象的角度来考虑的,那么就称为面向对象分析与设计(OOAD)。C++之类的语言是面向对象的,使用这样的语言编程称为面向对象编程(object-oriented programming,0OP),它可以让计算机程序员将一个面向对象的设计实现成为一个可工作的软件系统。

典型的C++程序开发环境

通常,C++程序要经历六个阶段,它们是编辑(edit)、预处理(preprocess)、编译(compile)、链接(link)、载入(load)和执行(execute)。

graph LR;
    编辑源代码 --> 预编译 --> 编译 --> 链接 --> 载入 --> 执行;
  1. 编辑源代码:用IDE编辑源代码
  2. 预编译:C++预处理器执行一些称为预处理器指令的命令,指示了在编译之前要先对程序进行某些处理。这些处理通常是包含其他要编译文件的文本和实现各种文本替换。
  3. 编译:编译器将C++程序翻译成机器语言代码——也就是目标代码。
  4. 链接:C++程序一般都包含了在别处定义的函数和数据的引用。例如,对在标准库或者私有库(由参与某特定项目的程序员小组所创建)中定义的函数和数据的引用。链接器则将目标代码和这些函数代码连接起来,形成可执行程序。如果程序编译和链接都没有问题,就会生成可执行程序
  5. 载入:在一个程序可以执行之前,必须先将它放入内存中。这由载入器来完成。载入器首先从磁盘中取得可执行程序,然后将其传输到内存,支持该程序的其他共享库组件在需要时载入器也会载入,最终会形成进程。
  6. 执行:在中央处理器的控制下,计算机以每次一条指令的方式执行程序。一些现代计算机体系结构可以并行地执行多条指令。

试运行一个C++应用程序

输出0-100的随机数,然后进行猜测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;

int main(){
srand((int)time(0)); // 产生随机种子 把0换成NULL也行
int targetNumber = rand() % 100;
// cout << "target number is " << targetNumber << endl;
bool flag = false;
while(!flag){
cout << "*************************" << endl;
cout << "please input guess number" << endl;
int guess_number;
cin >> guess_number;
if(guess_number == targetNumber){
cout << "winner winner, chicken dinner!" << endl;
flag = true;
}
else if(guess_number < targetNumber){
cout << "smeller then target number" << endl;
}
else{
cout << "bigger then target number" << endl;
}
}
system("pause");
return 0;
}

相关技术

操作系统:包含操作系统核心组件的软件称作内核(kernel)。

Mosalc、Netscape u web2.0的出现:1993年出现的Mosaic浏览器,使人们对网络的使用呈爆炸性增长。Mosaic浏览器的特点是具有用户友好的图形用户界面。Mare Andreessen,他在国家超级计算机应用中心的团队开发了Mosaic浏览器。他继续创立了Netscape公司。Netscape被很多人认为是点燃了20世纪90年代后期互联网经济大爆炸的公司。

软件开发的一些关键术语

术语 描述
Ajax Ajax是非常重要的Web2.0软件技术之一。Ajax可以帮助基于互联网的应用程序的执行像桌面应用程序一样——这是非常困难的一项任务,因为对于这样的应用,数据要来来回回地在用户的计算机和互联网上的服务器之间进行传递,造成了传输延迟
敏捷软件开发 敏捷软件开发(Agile Software Development)相比原来的软件开发方法,是用更少的资源获得更快的软件开发速度的一组方法。大家可以查看一下敏捷联盟(www.agilealliance.org)和敏捷宣言(www.agilemanifesto.org)
重构 重构(Refactoring)是指在保持程序原来的正确性和功能的基础上,对程序进行返工使代码更加清晰,更加容易维护。它被广泛使用在敏捷开发方法中。现在也有很多的IDE(集成开发环境)提供重构工具,它们可以自动完成大部分的重构工作。
设计模式 设计模式(Design patterns)是已经证明的体系结构,能够构造灵活的、可维护的面向对象软件。设计模式领域试图列举出那些重复出现的模式,鼓励软件设计者通过重用设计模式,用更少的时间、成本和精力来开发质量更佳的软件。
LAMP LAMP是许多开发者用于构建web应用程序的一组开源技术的缩写,它代表Linux、Apache、MySQL和PHP(或者Perl,或者Python——用于相似目的的另外两种语言)。MySQL是一个开源数据库管理系统。PHP是最受欢迎的开源服务器端互联网“脚本编写”语言,用于开发基于互联网的应用程序
软件即服务 一般来说,软件已经被视为一种产品,很多软件仍然以产品的方式给用户使用。如果想运行一个应用程序,你必须从软件开发商那里购买软件包——常常是一张CD或DVD,或是网络下载。然后在你的电脑上安装它,并在你需要时运行它。当软件的新版本出现时,你需要花很多的时间和相当的费用来升级你的软件。这个过程对于拥有成千上万的系统,而这些系统又运行在多种多样不同设备上,需要进行维护的机构来说,是非常令人头痛的。通过软件即服务(Software as a Serv-
ice,SaaS)技术,软件运行在互联网上其他处的服务器上。当服务器更新时,所有全球的客户不需要任何本地安装就能看到新的功能。你通过浏览器来访问服务。浏览器很轻便,你可以在全世界任何地方的不同种类的计算机上运行相同的应用程序。Salesforce.com、谷歌公司,以及微软公司的Office Live和Windows Live都提供SaaS。SaaS是一种云计算的能力
平台即服务 平台即服务(PaaS)是另一种云计算的能力。它为作为网络服务的应用程序的开发和运行提供一个计算平台,而不是在你的电脑上安装工具。PaaS提供者包括Google App Engine、Amazon EC2和Bungee labs等。
软件开发工具包 软件开发工具包(SDK)包括开发人员用于编写应用程序的工具和文档

软件开发版本

版本 描述
Alpha 软件的alpha版本是仍在积极开发中的软件产品的最早发布。Alpha版本常常是有错误、不完整和不稳定的,它们发布给相对数量较少的开发人员,用来测试新的特性,获得早期的反馈,等等
Bate 在软件开发过程后期,当大多数主要的错误已定位排除,新的特性接近完成之后,向大批开发人员发布软件的Beta版本。该版本软件更稳定,但仍可能发生变化
候选发布版 候选发布版(Release candidate)的软件版本一般而言功能完整,(据说)无错误,并准备让大众使用。它提供了一个多样化的测试环境——该软件用在不同的系统上,有不同的约束和用于各种各样的目的。任何出现的错误被纠正后,将最终的产品向公众发布。软件公司通常通过互联网发布增量式的更新。
连续beta 使用这种方法开发的软件通常没有版本号(例如,谷歌搜索或者Gmail)。这种软件驻留在“云”上(不是安装在您的计算机上),不断地在演化。因此,用户总是拥有最新的版本

C++11和开源的Boost库

2011年以前的C++标准为 C++0X 2011年以后的C++标准为 C++1X C++11是具有里程碑意义的C++标准 新标准扩展了C++标准库,包含了若干关于提高性能和安全的特性和增强内容。主流的C++编译器供应商已经实现了许多新C++11特性(如表所示)。欲了解更多信息,请访问C++标准委员会的网站www.open-std.org/jte1/sc22/wg21/和isocpp.org 。

编译器 描述C++11特性的URL
在每个主流C++编译器中实现的C++11特性 www.wiki.apache.org/stdexx/C%2B%2BOxCompilerSupport
Microsoft Visual C++ www.msdn.microsoft.com/en-us/library/hh567368.aspx
GNU编译器集(g++) www.gec.gnu.org/projects/cxx0x.html
Intel C++编译器 www.software.intel.com/en-us/articles/cOx-features-supported-by-intel-c-compiler/
IBM XL C/C++ www.ibm.com/developerworks/mydeveloperworks/blogs/5894415f-be62-4bc0-81c5-3956e822763/entry/xle_compiler_s_c_11_support50?lang=en
Clang clang.llvm.org/cxx_status.html
EDG ecpp www.edg.com/docs/edg_cpp.pdf

Boost C++库是由C++社区成员创建的一个免费的开源库。它们经同行评议,可以跨许多编译器和平台。如今Boost已经增长到超过100个库了,并且还在定期不断增长。现今在Boost开源社区已经有数千名程序员。Boost提供给C++程序员很多有用的设计良好的库,这些库与现在的C++标准库兼容。C++程序员可以在各种平台、多种不同的编译器上使用Boost库。一些新的C++11标准库的特性来自相应的Boost库。我们对这些库进行了概述,同时也提供了关于“正则表达式”和“智能指针”库的示例代码,等等。 正则表达式(Regular expressions)用于文本中特定字符模式的匹配。它可以用于验证数据,以确保数据是某一特定格式,或者用另外的字符串替换一个字符串中的某一部分,或者分割一个字符串。