C++冒险攻略(持续更新中。。。)
- 2020 年 3 月 8 日
- 筆記
绪论
计算机系统基本概念
计算机硬件
计算机程序语言
-
计算机解决问题是程序控制的
-
程序就是操作步骤
-
程序要使用语言来表达
机器语言
-
计算机能识别的是机器语言
-
机器语言指令是由0和1编码的
-
例如:加法指令可能是"0001"
计算机指令系统
-
机器硬件能够识别的语言(机器语言)的集合;
-
它是软件和硬件的主要界面。
计算软件
-
是一系列按照特定顺序组织的计算机数据和指令的集合。一般来讲软件被划分为系统软件、应用软件和介于这两者之间的中间件;
-
软件包括程序和文档。
编写大型程序时,尤其要注意编写文档
计算机程序
-
指令的序列;
-
描述解决问题的方法和数据。
计算机语言和程序设计方法
最初的计算机语言——机器语言
-
由二进制代码构成
-
计算机硬件可以识别
-
可以表示简单的操作
- 例如:加法、减法、数据移动等等
汇编语言
-
将机器指令映射为助记符
- 如ADD、SUB、mov等;
-
抽象层次低,需要考虑机器细节。
高级语言
-
关键字、语句容易理解;
-
有含义的数据命名和算式;
-
抽象层次较高;
- 例如,算式:a+b+c/d
-
屏蔽了机器的细节:
- 例如,这样显示计算结果:
- cout << a + b + c / d
- 例如,这样显示计算结果:
C++语言
-
是高级语言
-
支持面向对象的观点和方法
-
将客观事物看做对象
-
对象间通过消息传送进行沟通
-
支持分类和抽象
面向过程的程序设计方法
-
机器语言、汇编语言、高级语言都支持;
-
最初的目的:用于数学计算;
-
主要工作:设计求解问题的过程。
-
大型复杂的软件难以用面向过程的方式编写
面向对象的程序设计方法
-
由面向对象的高级语言支持;
-
一个系统由对象构成;
-
对象之间通过消息进行通信。
面向对象的基本概念
对象
-
一般意义上的对象:现实世界中实际存在的事物。
-
面向对象方法中的对象:程序中用来描述客观事物的实体。
抽象与分类
-
分类依据的原则——抽象;
-
抽象出同一类对象的共同属性和行为形成类;
-
类与对象是类型与实例的关系。
封装
-
隐蔽对象的内部细节;
-
对外形成一个边界;
-
只保留有限的对外接口;
-
使用方便、安全性好。
继承
-
意义在于软件复用;
-
改造、扩展已有类形成新的类。
多态
- 同样的消息作用在不同对象上,可以引起不同的行为。
程序的开发过程
程序
-
源程序:
- 用源语言写的,有待翻译的程序;
-
目标程序:
- 源程序通过翻译程序加工以后生成的机器语言程序;
-
可执行程序:
-
连接目标程序以及库中的某些文件,生成的一个可执行文件;
- 例如:Windows系统平台上的.EXE文件。
-
三种不同类型的翻译程序
-
汇编程序:
- 将汇编语言源程序翻译成目标程序;
-
编译程序:
- 将高级语言源程序翻译成目标程序;
-
解释程序:
- 将高级语言源程序翻译成机器指令,边翻译边执行。
C++程序的开发过程
-
算法与数据结构设计;
-
源程序编辑;
-
编译;
-
连接;
-
测试;
-
调试。
计算机中的信息与存储单位
计算机的基本功能
-
算术运算;
-
逻辑运算。
计算机中信息:
-
控制信息——指挥计算机操作;
-
数据信息——计算机程序加工的对象。
信息的存储单位
-
位(bit,b):数据的最小单位,表示一位二进制信息;
-
字节(byte,B):八位二进制数字组成(1 byte = 8 bit);
-
千字节 1 KB = 1024 B;
-
兆字节 1 MB = 1024 K;
-
吉字节 1 GB = 1024 M。
计算机的数字系统
计算机的数字系统
-
二进制系统;
-
基本符号:0、1。
程序中常用的数制:
- 制转换为十进制:
- 各位数字与它的权相乘,其积相加,例如:
- (11111111.11)2
=1×27+1×26+1×25+1×24+1×23+1×22+1×21+1×20+1×2-1+1×2-2
=(255.75)10
- (11111111.11)2
- 各位数字与它的权相乘,其积相加,例如:
十进制整数转换为R 进制整数:
-
“除以R取余”法。
- 6810=10001002
- 6810=10001002
十进制小数→ R 进制小数:
-
“乘 以R 取整”法。
- 0.312510 = 0.01012
- 0.312510 = 0.01012
二、八、十六进制的相互转换
-
1位八进制数相当于3位二进制数;
-
1位十六进制数相当于4位二进制数,例如:
-
(1011010.10)2=(001 011 010 .100)2=(132.4)8
-
(1011010.10)2=(0101 1010 .1000)2=(5A.8)16
-
(F7)16=(1111 0111)2=(11110111)2
-
数据在计算机中的编码表示
二进制数的编码表示
-
需要解决的问题:负数如何表示?
-
最容易想到的方案:
-
0:表示“+”号;
-
1:表示“-”号。
-
-
原码
-
"符号 ── 绝对值"表示的编码
- 例如:
- 例如:
-
原码的缺点:
-
零的表示不惟一
-
[+0]原 =000…0
-
[-0]原 =100…0
-
-
进行四则运算时,符号位须单独处理,运算规则复杂。
-
-
-
补码
-
符号位可作为数值参加运算;
-
减法运算可转换为加法运算;
-
0的表示唯一。
-
-
补码的原理
-
模数:
-
n位二进制整数的模数为 2n
-
n位二进制小数的模数为 2。
-
-
补数:
- 一个数减去另一个数(加一个负数),等于第一个数加第二个数的补数,
- 例(时钟指针): 8+(-2)=8+10 ( mod 12 )=6;
- 一个二进制负数可用其模数与真值做加法 (模减去该数的绝对值) 求得其补码,
- 例(时钟指针):-2+12=10。
- 一个数减去另一个数(加一个负数),等于第一个数加第二个数的补数,
-
-
补码的计算
-
借助于“反码”作为中间码;
-
负数的反码与原码有如下关系:
-
位不变(仍用1表示),其余各位取反(0变1,1变0),例如:
-
X=-1100110
-
[X]原 =1 1100110
-
[X]反 =1 0011001
-
-
正数的反码与原码表示相同,正数的补码与原码相同;
-
反码只是求补码时的中间码;
-
负数的补码由该数反码的末位加 1 求得。
-
对补码再求补即得到原码。
-
-
补码的优点:
-
0的表示唯一;
-
符号位可作为数值参加运算;
-
补码运算的结果仍为补码。
-
实数的浮点表示
-
计算机中通常采用浮点方式表示小数;
-
实数 N 用浮点形式可表示为: N = M × 2E
-
E:2的幂,N:阶码;
-
M:N的尾数。
-
字符在计算机中的表示
-
字符在计算机中是通过编码表示的;
-
例如:
-
ASCII码是一种常用的西文字符编码:用7位二进制数表示一个字符,最多可以表示27=128个字符;
-
《GB 18030-2005 信息技术 中文编码字符集》是中国国家标准。
-
C++简单程序设计
C++的特点和程序实例
C++的产生和发展
-
从C语言发展演变而来,最初被称为"带类的C";
-
1983年正式取名为C++;
-
1998年11月被国际标准化组织(ISO)批准为国际标准;
-
2003年10月15日发布第2版C++标准ISO/IEC 14882:2003;
-
2011年8月12日ISO公布了第三版C++标准C++11,包含核心语言的新机能、扩展C++标准程序库。
-
2014年8月18日ISO公布了C++14,其正式名称为"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。
-
C++14作为C++11的一个小扩展,主要提供漏洞修复和小的改进。
C++的特点
-
兼容C,支持面向过程的程序设计;
-
支持面向对象的方法;
-
支持泛型程序设计方法。
命名空间
避免命名冲突
std是C++标准库的命名空间(namespace)名
using namespace std表示打开std命名空间
//例2_1.cpp #include <iostream> using namespace std; int main() { cout << "Hello!" << endl; cout << "Welcome to c++!" << endl; return 0; }
Hello! Welcome to c++!
C++字符集和词法记号
字符集
词法记号
- 关键字
- C++预定义的单词
- 标识符
- 程序员声明的单词,它命名程序正文中的一些实体
- 文字
- 在程序中直接使用符号表示的数据
- 分隔符
-
用于分隔各个词法记号或程序正文
()
{}
,
:
;
-
- 运算符(操作符)
- 用于实现各种运算的符号
- 空白符
- 空格、制表符(TAB键产生的字符)、垂直制表符、换行符、回车符和注释的总称
标识符的构成规则
-
以大写字母、小写字母或下划线(_)开始。
-
可以由以大写字母、小写字母、下划线(_)或数字0~9组成。
-
大写字母和小写字母代表不同的标识符。
-
不能是C++关键字或操作符。
基本数据类型、常量、变量
C++能够处理的基本数据类型
-
整数类型;
-
浮点数类型;
-
字符类型;
-
布尔类型。
程序中的数据
-
常量
-
在源程序中直接写明的数据;
-
其值在整个程序运行期间不可改变。
-
-
变量
-
在程序运行过程中允许改变的数据。
整数类型
-
基本的整数类型:int
-
按符号分
-
符号的(signed)
-
无符号的(unsigned)
-
-
按照数据范围分
-
短整数(short)
-
长整数(long)
-
长长整数( long long )
-
-
-
ISO C++标准并没有明确规定每种数据类型的字节数和取值范围,它只是规定它们之间的字节数大小顺序满足:
(signed/unsigned)signed char ≤(unsigned) short int ≤(unsigned) int ≤(unsigned) long int ≤ long long int
字符类型(char)
-
容纳单个字符的编码;
-
实质上存储的也是整数。
浮点数类型
-
单精度(float)
-
双精度(double)
-
扩展精度(long double)
注意:浮点数在计算机中是近似储存的,不能直接比较两个浮点数的大小。
字符串类型
-
有字符串常量
-
基本类型中没有字符串变量
-
采用字符数组存储字符串(C风格的字符串)
-
标准C++类库中的String类(C++风格的字符串)
布尔类型(bool)
-
只有两个值:true(真) 、false(假)
-
常用来表示关系比较、相等比较或逻辑运算的结果
各基本类型的取值范围
常量
-
在程序运行的整个过程中其值始终不可改变的量;
-
直接使用符号(文字)表示的值;
-
例如:12,3.5,’A’都是常量。
整数常量
-
以文字形式出现的整数;
-
十进制
- 若干个0~9的数字,但数字部分不能以0开头,正数前边的正号可以省略。
-
八进制
- 前导0+若干个0~7的数字。
-
十六进制
- 前导0x+若干个0~9的数字及A~F的字母(大小写均可)。
-
后缀
- 后缀L(或l)表示类型至少是long,
- 后缀LL(或ll)表示类型是long long,
- 后缀U(或u)表示unsigned类型。
-
浮点数常量
-
以文字形式出现的实数;
-
一般形式:
- 例如,12.5,-12.5等。
-
指数形式:
- 例如,0.345E+2,-34.4E-3;
-
整数部分和小数部分可以省略其一。
-
-
浮点常量默认为double型,如果后缀F(或f)可以使其成为float型,例如:12.3f。
字符常量
-
单引号括起来的一个字符,如:’a’、’D’、’?’、’$’;
-
C++转义字符列表(用于在程序中表示不可显示字符)
C风格字符串常量
-
一对双引号括起来的字符序列
-
在内存中按串中字符的排列次序顺序存放,每个字符占一个字节
-
在末尾添加‘