第一章 C++概述
1.1 C++简介
“C++”中的 ++ 来自于C语言中的递增运算符 ++,该运算符将变量加1。C++ 起初也叫”c with clsss”.通过名称表明,C++ 是对C的扩展,因此C++ 是C语言的超集,这意味着任何有效的c程序都是有效的C++ 程序。C++ 程序可以使用已有的C程序库。
库是编程模块的集合,可以在程序中调用它们。库对很多常见的编程问题提供了可靠的解决方法,因此可以节省程序员大量的时间和工作量。
C++ 语言在C语言的基础上添加了面向对象编程和泛型编程的支持。C++ 继承了C语言高效,简洁,快速和可移植的传统。
C++ 融合了3种不同的编程方式:
- C语言代表的过程性语言.
- C++ 在C语言基础上添加的类代表的面向对象语言.
- C++ 模板支持的泛型编程。
C语言和C++语言的关系:
c++ 语言是在C语言的基础上,添加了面向对象、模板等现代程序设计语言的特性而发展起来的。两者无论是从语法规则上,还是从运算符的数量和使用上,都非常相似,所以我们常常将这两门语言统称“C/C++”。
C语言和C++并不是对立的竞争关系:
- C++ 是C语言的加强,是一种更好的C语言。
- C++ 是以C语言为基础的,并且完全兼容C语言的特性。
C语言和C++ 语言的学习是可以相互促进。学好C语言,可以为我们将来进一步地学习C++ 语言打好基础,而C++ 语言的学习,也会促进我们对于C语言的理解,从而更好地运用C语言。
1.2 C++起源
与c语言一样,c++ 也是在贝尔实验室诞生的,Bjarne Stroustrup(本贾尼·斯特劳斯特卢普)在20世纪80年代在这里开发了这种语言。
(C++之父-本贾尼·斯特劳斯特卢普)
Stroustrup关心的是让c++ 更有用,而不是实施特定的编程原理或风格。在确定语言特性方面,真正的编程比纯粹的原理更重要。Stroustrup之所以在c的基础上创建c++,是因为c语言简洁、适合系统编程、使用广泛且与UNIX操作系统联系紧密。
用他自己的话来说,“C++ 主要是为了我的朋友和我不必再使用汇编语言、C语言或者其他现代高级语言来编程而设计的。它的主要功能是可以更方便得编写出好程序,让每个程序员更加快乐”。
1.3 可移植性和标准
假设为运行windows 2000的老式奔腾pc编写了一个很好用的c++ 程序,而管理员决定使用不同操作系统(比如说Mac OS 或 Linux)和处理器的计算机替换它。该程序是否可在新平台运行呢?当然,但是必须使用为新平台设计的c++ 编译器重新编译。但是是否需要修改写好的代码?如果不需要修改代码的情况下,重新编译程序后,程序依然运行良好,该程序是可移植的。
程序是否可移植性有两个问题需要解决。第一是硬件,针对特定硬件编程的程序是不可移植的。第二,语言的实现,windows xp c++ 和 Redhat Linux 或 Mac OS X对c++ 的实现不一定相同。虽然我们希望c++ 版本与其他版本兼容,但是如果没有一个公开的标准,很难做到。因此,美国国家标准局(American National Standards Institute,ANSI)在1990年设立一个委员会专门负责制定c++ 标准(ANSI制定了c语言的标准)。国际标准化组织(International Organization for Standardization,ISO)很快通过自己的委员会加入到这个行列,创建了联合组织ANSI/ISO,制定c++ 标准。
经过多年的努力,制定出了一个国际标准ISO/IEC 14882:1998 ,并于1998年获得了ISO、IEC(International Electrotechnical Committee,国际电工技术委员会)和ANSI的批准。这个标准就是我们经常所说的c++98。它不仅描述了已有的c++ 特性,还对语言进行了扩展,添加了异常、运行阶段类型识别(RTTI)、模板和标准模板库(STL).
2003年,发布了c++ 标准第二版(IOS/IEC 14882:2003),这一版本对第一版修订了一些错误,但并没有改变语言特性,因此c++98表示c++98/c++2003.
c++ 不断发展。IOS标准委员会于2011年8月批准了新标准ISO/IEC 14882:2011,该标准被称为c++11,与c++98一样c++11也新增了许多特性。
ISO c++ 标准还吸收了ANSI c语言标准,c++ 尽量做到是c的超集。意味着在理想情况下,任何有效的c程序都应该是有效的c++ 程序。
ANSI不仅定义了c语言,还 定义了一个ANSI c必须实现的标准c库。c++ 也在使用这个库,另外ANSI/ISO c++ 标准还提供了一个c++ 标准类库。
1.4 为什么C++会成功
c++ 最初的目的是将c语言转变为OOP(面向对象程序设计)语言,但是c++ 后来并没有这么做,而是立足于程序的实际。因为在c 语言方面大量投入的程序员使其完全丢掉c 语言那种编程的思考方式,转而去接受一种新的语言,新的思维,那么将会导致这些程序员中大部分人在短时间内可能毫无成果,使其生产率降低。但是如果让这些c程序员在已有知识的基础上,再去学习c++ 语言,理解运用OOP,那么也只是在其已有思维的基础上进行扩展而已,这样可以保持其更好的生产率。
简而言之,强迫程序员放弃c语言和c语言的思考方式,而去转到OOP上是需要代价的,但是从c语言转到c++ 所花费的代价就会小很多。所以也可以理解为c++ 的出现并不是去替代c,而是对c的扩展,所以在c++ 中既可以使用c++ 新特性,并且可以使用c的过程式思维来编写程序。
对于传统的结构化语言,我们向来没有太多的疑惑,函数调用那么自然而明显,只是从程序的某一个地点调到另一个地点去执行。但是对于面向对象(OO)语言,我们疑惑就会很多。其原因就是c++编译器为我们程序员做了太多隐藏的工作:构造函数,析构函数、虚函数、继承、多态....有时候它为我们合成出一些额外的函数,有时候它又偷偷在我们写的函数里,放进更多的操作。有时候也会给我们的对象里放进一些奇妙的东西,使得我们sizeof的时候结果可我们预期不一样。
第二章 C++初识
2.1 简单的C++程序
2.1.1 c++ hello world
请打开一下示例代码:
#include<iostream>
using namespace std;
int main(){
cout << "hello world" << endl;
return EXIT_SUCCESS;
}
分析:
-
#include<iostream>;
预编译指令,引入头文件iostream
. -
using namespace std;
使用标准命名空间 -
cout << “hello world”<< endl;
和printf
功能一样,输出字符串”hello wrold”
问题1:c++头文件为什么没有.h?
在c语言中头文件使用扩展名 .h ,将其作为一种通过名称标识文件类型的简单方式。但是c++ 得用法改变了,c++ 头文件没有扩展名。但是有些c语言的头文件被转换为c++ 的头文件,这些文件被重新命名,丢掉了扩展名 .h (使之成为c++ 风格头文件),并在文件名称前面加上前缀c(表明来自c语言)。例如c++ 版本的math.h为cmath.
由于C使用不同的扩展名来表示不同文件类型,因此用一些特殊的扩展名(如hpp或hxx)表示c++ 的头文件也是可以的,ANSI/IOS标准委员会也认为是可以的,但是关键问题是用哪个比较好,最后一致同意不适用任何扩展名。
头文件类型 | 约定 | 示例 | 说明 |
---|---|---|---|
c++旧式风格 | 以.h结尾 | iostream.h | c++程序可用 |
c旧式风格 | 以.h结尾 | math.h | c/c++程序可用 |
c++新式风格 | 无扩展名 | iostream | c++程序可用,使用namespace std |
转换后的c | 加上前缀c,无扩展名 | cmath | c++程序可用,可使用非c特性,如namespace std |
问题2:using namespace std 是什么?
namespace是指标识符的各种可见范围。命名空间用关键字namespace 来定义。命名空间是C++ 的一种机制,用来把单个标识符下的大量有逻辑联系的程序实体组合到一起。此标识符作为此组群的名字。
问题3:cout 、endl 是什么?
cout是c++ 中的标准输出流,endl是输出换行并刷新缓冲区。
2.1.2 面向过程
面向过程是一种以过程为中心的编程思想。
通过分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向过程编程思想的核心:功能分解,自顶向下,逐层细化(程序=数据结构+算法)。
面向过程编程语言存在的主要缺点是不符合人的思维习惯,而是要用计算机的思维方式去处理问题,而且面向过程编程语言重用性低,维护困难。
2.1.3 面向对象
面向对象编程(Object-Oriented Programming)简称 OOP 技术,是开发计算机应用程序的一种新方法、新思想。过去的面向过程编程常常会导致所有的代码都包含在几个模块中,使程序难以阅读和维护。在做一些修改时常常牵一动百,使以后的开发和维护难以为继。而使用 OOP 技术,常常要使用许多代码模块,每个模块都只提供特定的功能,它们是彼此独立的,这样就增大了代码重用的几率,更加有利于软件的开发、维护和升级。
在面向对象中,算法与数据结构被看做是一个整体,称作对象,现实世界中任何类的对象都具有一定的属性和操作,也总能用数据结构与算法两者合一地来描述,所以可以用下面的等式来定义对象和程序:
对象 = 算法 + 数据结构
程序 = 对象 + 对象 + ……
从上面的等式可以看出,程序就是许多对象在计算机中相继表现自己,而对象则是一个个程序实体。
面向对象编程思想的核心:应对变化,提高复用。
2.1.4 面向对象三大特性
-
封装
把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
类将成员变量和成员函数封装在类的内部,根据需要设置访问权限,通过成员函数管理内部状态。 -
继承
继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的特征和能力。
继承的作用: 避免公用代码的重复开发,减少代码和数据冗余。 -
多态
多态性可以简单地概括为“一个接口,多种方法”,字面意思为多种形态。程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。
网友评论