C++简介
C++融合了三种不同的编程方式:- C 语言代表的过程性语言
- C++在C语言基础上添加的类代表的面向对象语言
- C++模板支持的泛型编程。
值得一提的是,不要把 C 语言与C++混为一谈,他们可以说是两个不同的语言。
C++简史
2.1 C语言
20世纪70年代,贝尔实验室的 Dennis Ritchie 致力于开发 UNIX 系统,为此,需要一种简洁,能够快速生成简洁、快速的程序,并且能有效的控制硬件;传统上,程序员使用汇编语言来满足这些需求,然而汇编语言是低级(low-level)语言,只针对特定计算机进行处理,而 UNIX 是为在不同的平台上工作而设计的,这意味着他是一种高级(high-level)语言。高级语言致力于解决问题,而不针对特定的硬件,一种被称为编译器的特殊程序将高级语言翻译成特定计算机的内部语言,这样就可以通过对每个平台应用使用不同的编译器来在不同的编平台上使用同一个高级语言程序了, Ritchie 在旧语言的基础上,开发出了将低级语言的效率、硬件访问能力和高级语言的通用性、可移植性融合在一起的C语言。2.2 C语言编程原理
一般来说,计算机语言要处理两个概念:数据和算法。数据是程序使用和处理的信息,而算法是程序使用的方法。C 语言在最初面世时是过程性(procedural)语言,这意味着它强调的是编程的算法方面。:::info
过程化编程:
过程化编程首先要确定计算机应采取的操作,然后使用编程语言来实现这些操作。程序命令计算机按一系列流程生成特定的结果。:::
随着编程规模的扩大,早期编程语言(BASIC等)都会遇到组织方面的问题,为了解决这些问题,计算机科学家开发出了一种更有序的编程方法——结构化编程(structured programming)。C 语言具有使用这种方法的特性,例如结构化编程将分支限定为一小组行为良好的结构。
另一个新原则是自顶向下(top-down)的设计,在 C 语言中,其理念是将大型程序分解成小型、便于管理的任务。如果其中的一项任务任然过大,则将他分解为更小的任务,这一过程将一直持续下去,直到将程序划分为小型的、易于编写的模块。C 语言的设计有助于使用这种方法,他鼓励程序员开发程序单元(函数)来表示各个任务模块。
如上所述,结构化编程技术反映了过程化编程的思想,根据执行的操作来构思一个程序。
2.3 面向对象编程
虽然结构化编程的理念提高了程序的清晰度、可靠性,并使之便于维护,但他在编写大型程序时,仍面临着挑战,为应付这种挑战,面向对象( OOP )编程提供了一种新方法。与强调算法的过程性编程不同的是, OOP 强调的是数据, OOP 不像过程性编程那样,试图使问题满足语言的过程性方法,而是试图让语言来满足问题的要求。其理念是设计与问题的本质特征相对应的数据格式。在 C++ 中,类是一种规范,他描述了这种新型数据格式,对象是根据这种规范构造的特定数据结构。通常,类规定了可使用哪些数据来表示对象以及可以对这些数据执行哪些操作。
OOP 程序设计方法首先设计类,他们准确的表示了程序要处理的东西。然后你便可以设计一个使用这些类的对象的程序。从低级组织(如类)到高级组织(如程序)的处理过程叫作自下向上(bottom-up)的编程。
OOP 编程不仅是将数据和方法合并为类定义。 OOP 还有助于创建可重用的代码,这将减少大量的工作。信息隐藏可以保护数据,使其免遭不适当的访问。多态让你能够为运算符和函数创建多个定义,通过编程上下文来确定使用哪个定义。继承让你能够使用旧类派生出新类。
OOP 三大特性:继承、封装、多态。
2.4 C++和泛型编程
泛型编程(generic programming)是 C++ 支持的另一种编程模式,他与 OOP 的目标相同,即使重用代码和抽象通用概念的技术更简单。不过 OOP 强调的是编程的数据方面,而泛型编程强调的是独立于特定数据类型,他们的侧重点不同。OOP 是一个管理大型项目的工具,而泛型编程提供了执行常见任务的工具。术语泛型(generic)指的是创建独立于类型的代码。
2.5 C++的起源
与C语言一样,C++ 也是在贝尔实验室诞生的,Bjarne Stroustrup 于20世纪80年代在这里开发出了这种语言。Stroustrup 之所以在 C 的基础上创建 C++ ,是因为 C 语言简洁、适合系统编程,使用广泛且与 UNIX 操作系统联系紧密。C++ 是 C 语言的超集,这意味着任何有效的 C 程序都是有效的 C++ 程序。它们之间有些细微的差异,但无足轻重。C++ 程序可以使用已有的 C 软件库。名称 C++ 来自 C 语言中的递增运算符 ,该运算符将变量+1,名称 C++ 表明,它是C的拓充版本。
计算机程序将实际问题转换为计算机能够执行的一系列操作。OOP 部分赋予了C语言将问题所设计的概念联系起来的能力,C 部分则赋予 C语言紧密联系硬件的能力,这种能力上的结合成就了 C++ 的广泛传播。
在 C 获得一定程度的成功后,Stroustup 才添加了模板,这使得进行泛型编程成为可能。在模板特性被使用和改进后,人们才逐渐认识到,他们和OOP同样重要——甚至比OOP 还重要。C++ 融合了 OOP 、泛型编程和传统的过程性方法,这表明 C++ 强调的是实用价值,而不是意识形态方法,这也是该语言获得成功的原因之一。
可移植性和标准
假设你在运行 Windows 系统的 PC 上编写了一个很好用的 C++ 程序,而管理人员决定用使用不同操作系统和处理器的计算机替换它,该程序是否可以在新平台是运行呢?当然,必须使用为新平台设计的 C++ 编译器对程序进行重新编译。但是否需要修改编写好的代码呢?如果在不修改代码的情况下,重新编译程序后,程序将良好运行,则该程序是可移植的。在可移植性方面存在两个障碍,其中的一个是硬件,硬件特定的程序是不可移植的。第二个障碍是语言上的差异,计算机语言也可能出现方言,Windows XP C++的实现与 Red Hat Linux 或 Macintosh OS X实现相同吗?虽然多数实现都希望其 C++版本与其他版本兼容,但如果没有准确描述语言工作方式的公开标准,这将很难做到。因此美国国家标准局(American National Standard Institute,ANSI)在1990年设立了一个委员会(ANSI X3J16),专门负责制定 C++标准(ANSI 制定了 C 语言标准)。国际标准化组织(ISO)很快通过自己的委员会(ISO-WG-21)加入了这个行列,创建了联合组织 ANSI/ISO,致力于制定 C++标准。
经过多年的努力,制定出了一个国际标准 ISO/IEC 14882:1998,并于1998年获得了 ISO、IEC(International Electrotechnical Committee,国际电工技术委员会)和 ANSI 的批准,该标准常被称为 C++98,它不仅描述了已有的 C++特性,还对该语言进行了拓展,添加了异常、运行阶段类型识别(RTTI)、模板和标准模板库(STL)。
2003年,发布了 C++标准第二版 (ISO/IEC 14882:2003),这个新版本是一次技术性修订,这意味着它对第一版进行了整理——修订错误、减少多义性等,但没有改变语言特性,因此我们使用 C++98表示 C++98/C++2003。
C++在不断发展,ISO 标准委员会于2011年8月批准了新标准 ISO/IEC 14882:2011,该标准以前称为 C++11,与 C++98一样,C++也新增了众多特性。另外,其目的是消除不一致性,让 C++学习和使用起来更容易,该标准还曾被称为 C++0x。
ISO C++标准还吸收了 ASNI C 语言标准。因为 C++尽量是 C 语言的超集。
当然,现在已经有了 C++14、C++17、C++20等,但最常用的仍然是 C++11。
程序创建的技巧
假设我们编写了一个 C++程序,如何让他运行起来?具体的步骤却决于计算机环境和使用的 C++编译器,但大体如下:使用文本编辑器编写程序,并将其保存到文件中,这个文件就是程序的源代码。
有些 C++实现提供了集成开发环境(integrated development environment, IDE),可以在主程序中管理程序开发的所有步骤,包括编辑。有些实现只能处理编译和链接阶段,要求在系统命令行输入命令。在这种情况下,可以使用任意文本编辑器来创建和修改源代码。如果将文件保存为标准 ASCII 文本文件,甚至可以使用字处理器。给源文件命名时,必须使用正确的后缀,将文件标识为 C++文件。这不仅告诉你是 C++文件,还将这种信息告知编译器。后缀由一个句点和多个字符组成,这些字符被称作拓展名。
使用什么拓展名却决于 C++实现,如下表
C++实现 | 源代码文件的拓展名 |
---|---|
UNIX | C, cc, cxx, c |
GUN C++ | C, cc, cxx, cpp, c++ |
Digital Mars | cpp, cxx |
Borland C++ | cpp |
Watcom | cpp |
Microsoft Visual C++ | cpp, cxx, cc |
Freestyle Code Warrior | cp, cpp, cc, cxx, c++ |
编译源代码
:::info 这意味着运行一个程序,将源代码翻译为主机使用的内部语言——机器语言。包含了翻译后的程序的文件就是程序的目标代码(object code)。:::
最初,Stroustrup 实现 C++ 时,使用了一个 C++ 到 C 的编译器,而不是开发直接的 C++ 代码的编译器。叫 cfront(表示 C 前端, C front end)。随着 C++ 的日渐普及,越来越多的实现转向创建 C++ 编译器,直接将 C++ 源代码生成目标代码,这种直接方法加速了编译过程,并强调 C++ 是一种独立的语言。
UNIX 编译和链接
最初,UNIX 命令 CC 调用 cfront, 但 cfront 未能紧跟 C++ 的发展步伐,其最后一个版本发布于1993年,当今的 UNIX 计算机可能没有编译器、有专用编译器或者第三方编译器,这些编译器可能是商业的,也可能是自由软件。此处使用 CC 命令做讲解,但是实际上可能需要其他命令来代替。编译 C++ 源代码文件 spiffy.C,则在 UNIX 提示符下输入命令:
CC spiffy.C
如果程序没有错误,编译器将生成一个拓展名为 o 的目标代码文件。(即 spiffy.o)
接下来,编译器自动将目标代码传递给系统链接程序,该程序将代码与库代码结合起来,生成一个可执行文件。在默认情况下,可执行文件为 a.out。如果只有一个源文件,链接程序还会删除 spiffy.o 文件,因为不再需要了。要运行该程序,只需要输入可执行文件的文件名即可:
a.out
注意,如果编译新程序,新的可执行文件 a.out 将覆盖已有的 a.out 文件。
与在 C 语言中一样,在 C++中,程序也可以包含多个文件,在这种情况下,可以通过在命令行上列出全部文件来编译程序:
CC my.C precious.C
如果有多个源代码文件,则编译器将不会删除目标代码文件。这样,如果只修改了my.C文件,则可以用下面的命令重新编译该程序:
CC my.C precious.o
这将重新编译my.C文件,并将它与前面编译的precious.o文件链接起来。
可能需要显式地指定一些库。例如,要访问数学库中定义的函数,必须在命令行中加上-lm标记:
CC usingmath.C -lm
linux 编译和链接
Linux系统中最常用的编译器是 g++,这是来自 Free Software Foundation 的 GNUC++编译器。Linux的多数版本都包括该编译器,但并不一定总会安装它。g++编译器的工作方式很像标准 UNIX 编译器。例如,下面的命令将生成可执行文件 a.out
g++ spiffy.cxx
有些版本可能要求链接C++库:
g++ spiffy.cxx -lg++
要编译多个源文件,只需将它们全部放到命令行中即可:
g++ my.cxx precious.cxx
这将生成一个名为a.out的可执行文件和两个目标代码文件 my.o 和 precious.o。如果接下来修改了其中的某个源代码文件,如 mu.cxx,则可以使用 my.cxx 和 precious.o 来重新编译:
g++ my.cxx precious.o
GNU 编译器可以在很多平台上使用,包括基于 Windows 的 PC 和在各种平台上运行的 UNIX 系统。
Windows命令行编译器
要在 Windows PC 上编译 C++ 程序,可以下载一个在 Windows 命令提示符模式下运行的免费命令行编译器。Cygwin 和 MinGW 都包含编译器 GNU C++,且可免费下载;它们使用的编译器名为 g++。要编译名为 great.cpp 的源代码文件,在提示符下输入如下命令:
g++ great.cpp
如果程序编译成功,则得到的可执行文件名为a.exe。
Windows编译器
Windows 产品很多且修订频繁,无法对它们分别进行介绍。当前,最流行是Microsoft Visual C++ 2022,可以使用免费版,当然还有 CLion、QT等。其他例如蓝桥杯使用的 Devc++ 、老式的 VC6++、codeblocks,VS 2010教育版等通常,必须为程序创建一个项目,并将组成程序的一个或多个文件添加到该项目中。每个厂商提供的 IDE(集成开发环境)都包含用于创建项目的菜单选项(可能还有自动帮助)。必须确定的非常重要的一点是,需要创建的是什么类型的程序。通常,编译器提供了很多选择,如Windows应用程序、MFC Windows 应用程序、动态链接库、ActiveX 控件、DOS 或字符模式的可执行文件、静态库或控制台应用程序等。其中一些可能既有32位版本,又有64位版本。创建好项目后,需要对程序进行编译和链接。IDE通常提供了多个菜单项,如 Compile(编译)、Build(建立)、Make(生成)、BuildAll(全部建立)、Link(链接)、Execute(执行)、Run(运行)和Debug(调试),不过同一个IDE中,不一定包含所有这些选项。
现在的编译器已经越来越智能化,很多编译器的使用手册已经可以称为一本书了,所以这里不多做描述,有机会可以单独写一些文章来介绍他们。
如果程序违反了语言规则,编译器将生成错误消息,指出存在问题的行。遗憾的是,如果不熟悉语言,将难以理解这些消息的含义。有时,真正的问题可能在标识行之前;有时,一个错误可能引发一连串的错误消息。
:::info
改正错误时,应首先改正第一个错误。如果在标识为有错误的那一行上找不到错误,请查看前一行。
:::
需要注意的是,程序能够通过某个编译器的编译并不意味着它是合法的 C++程序;同样,程序不能通过某个编译器的编译也并不意味着它是非法的 C++程序。与几年前相比,现在的编译器更严格地遵循了 C++标准。另外,编译器通常提供了可用于控制严格程度的选项。同样的,现在的大多数 IDE 可以自由的切换 C++版本,不同版本之间的差异也可能造成编译的问题。
通常,IDE 允许在辅助窗口中运行程序。程序执行完毕后,有些 IDE 将关闭该窗口,而有些 IDE 不关闭 关闭窗口,将难以看到程序输出,除非您眼疾手快、过目不忘。为查看输出,必须在程序最后加上代码:
cin.get();
cin.get();
cin.get() 语句读取下一次键击,因此上述语句让程序等待,直到按下了 Enter 键(在按下 Enter 键之前,键击将不被发送给程序,因此按其他键都不管用)。如果程序在其常规输入后留下一个没有被处理的键击,则第二条语句是必需的。例如,如果要输入一个数字,则需要输入该数字,然后按Enter 键。程序将读取该数字,但 Enter 键不被处理,这样它将被第一个 cin.get() 读取。
Macintosh上的C++
当前,Apple 随操作系统 Mac OS X 提供了开发框架 Xcode,该框架是免费的,但通常不会自动安装。要安装它,可使用操作系统安装盘,也可从 Apple 网站免费下载(但需要注意的是,它超过4GB)。Xcode 不仅提供了支持多种语言的 IDE,还自带了两个命令行编译器(g++和 clang),可在 UNIX 模式下运行它们。而要进入 UNIX 模式,可通过实用程序 Terminal。将目标代码与其他代码链接起来
:::info C++库包含一系列计算机例程(被称为函数)的目标代码,这些函数可以执行诸如在屏幕上显示信息或计算平方根等任务。链接指的是将目标代码同使用的函数的目标代码以及一些标准的启动代码(start code)组合起来,生成程序的运行阶段脚本。包含该最终产品的文件被称为可执行代码。:::
标签:语言,预备,编程,程序,笔记,编译,编译器,C++ From: https://blog.csdn.net/2402_87415953/article/details/142345870