目录
1.1C++简介
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。
C++ 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,最初命名为带类的C,后来在 1983 年更名为 C++。
C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。
注:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。
1.2面向对象程序设计
C++ 完全支持面向对象的程序设计。
包括面向对象开发的四大特性:
- 封装(Encapsulation):封装是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活性。
- 继承(Inheritance):继承是从已有类中派生出新类,新类具有已有类的属性和方法,并且可以扩展或修改这些属性和方法。这样可以提高代码的复用性和可扩展性。
- 多态(Polymorphism):多态是指同一种操作作用于不同的对象,可以有不同的解释和实现。它可以通过接口或继承实现,可以提高代码的灵活性和可读性。
- 抽象(Abstraction):抽象是从具体的实例中提取共同的特征,形成抽象类或接口,以便于代码的复用和扩展。抽象类和接口可以让程序员专注于高层次的设计和业务逻辑,而不必关注底层的实现细节。
2.1C++基本语法
C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。
- 对象:对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。
- 类:类可以定义为描述对象行为/状态的模板/蓝图。
- 方法:从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。
- 即时变量:每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。
2.1.1C++中的分号、语句块
在 C++ 中,分号是语句结束符。它表明一个逻辑实体的结束。
语句块是一组使用大括号括起来的按逻辑连接的语句。
C++ 不以行末作为结束符的标识。
2.1.2C++标识符
C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
C++ 标识符内不允许出现标点字符,比如 @、& 和 %。C++ 是区分大小写的编程语言。
2.1.3C++关键字
C++ 中的保留字不能作为常量名、变量名或其他标识符名称。
完整关键字介绍:C++ 的关键字(保留字)完整介绍
2.2C++注释
程序的注释是解释性语句,可以提高源代码的可读性。所有的编程语言都允许某种形式的注释。
C++ 支持单行注释和多行注释。注释中的所有字符会被 C++ 编译器忽略。
C++ 注释一般有两种:
// 一般用于单行注释。注释以 // 开始,直到行末为止。
/* ... */ 一般用于多行注释。以/* 开始,以 */ 终止。
在 /* 和 */ 注释内部,// 字符没有特殊的含义。在 // 注释内,/* 和 */ 字符也没有特殊的含义。因此可以在一种注释内嵌套另一种注释。
2.3C++数据类型
使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么。
2.3.1基本的内置类型
C++提供了丰富的内置类型。七种基本的数据类型:
布尔型 |
bool |
字符型 |
char |
整型 |
int |
浮点型 |
float |
双浮点型 |
double |
无类型 |
void |
宽字符型 |
wchar_t |
一些基本类型可以使用一个或多个类型修饰符进行修饰:
如:signed、unsigned、short、long
2.3.2typedef声明
可以使用 typedef 为一个已有的类型取一个新的名字。
2.3.3枚举类型
枚举类型C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
如果一个变量只有几种可能的值,可以定义为枚举类型。所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。
创建枚举,需要使用关键字 enum。枚举类型的一般形式为:
enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
……
标识符[=整型常数]
} 枚举变量;
如果枚举没有初始化, 即省掉"=整型常数"时, 则从第一个标识符开始。默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。但是也可以给名称赋予一个特殊的值,只需要添加一个初始值即可。
2.3.4类型转换
类型转换是将一个数据类型的值转换为另一种数据类型的值。
C++ 中有四种类型转换:静态转换、动态转换、常量转换和重新解释转换。
2.3.4.1静态转换
静态转换是将一种数据类型的值强制转换为另一种数据类型的值。通常用于比较类型相似的对象之间的转换,例如将 int 类型转换为 float 类型。静态转换不进行任何运行时类型检查,因此可能会导致运行时错误。
2.3.4.2动态转换
动态转换通常用于将一个基类指针或引用转换为派生类指针或引用。动态转换在运行时进行类型检查,如果不能进行转换则返回空指针或引发异常。
2.3.4.3常量转换
常量转换用于将const类型的对象转换为非const 类型的对象。
常量转换只能用于转换掉 const 属性,不能改变对象的类型。
2.3.4.4重新解释转换
重新解释转换将一个数据类型的值重新解释为另一个数据类型的值,通常用于在不同的数据类型之间进行转换。重新解释转换不进行任何类型检查,因此可能会导致未定义的行为。
2.4C++变量类型
C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C++ 是大小写敏感的。
在 C++ 中,类型的长度取决于编译器和计算机架构,然而,C++ 标准规定了不同整数类型的最小范围,而不是具体的字节数,这是为了确保代码在不同的系统上都能正确运行。
2.4.1整数类型
- int:用于表示整数,通常占用4个字节。
- short:用于表示短整数,通常占用2个字节。
- long:用于表示长整数,通常占用4个字节。
- long long:用于表示更长的整数,通常占用8个字节。
2.4.2浮点类型
- float:用于表示单精度浮点数,通常占用4个字节。
- double:用于表示双精度浮点数,通常占用8个字节。
- long double:用于表示更高精度的浮点数,占用字节数可以根据实现而变化。
2.4.3字符类型
- char:用于表示字符,通常占用1个字节。
- wchar_t:用于表示宽字符,通常占用2或4个字节。
- char16_t:用于表示16位Unicode字符,占用2个字节。
- char32_t:用于表示32位Unicode字符,占用4个字节。
2.4.4布尔类型
- bool:用于表示布尔值,只能取true或false。
2.4.5枚举类型
- enum:用于定义一组命名的整数常量。
2.4.6指针类型
- type*:用于表示指向类型为type的对象的指针。
2.4.7数组类型
- type[]或type[size]:用于表示具有相同类型的元素组成的数组。
2.4.8结构体类型
- struct:用于定义包含多个不同类型成员的结构。
2.4.9类类型
- class:用于定义具有属性和方法的自定义类型。
2.4.10共用体类型
- union:用于定义一种特殊的数据类型,可以在相同的内存位置存储不同的数据类型。
2.5C++变量定义
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。
变量定义指定一个数据类型,并包含一个或多个变量的列表。
如:
int i, j, k;
变量可以在声明的时候被初始化。等号后跟一个常量表达式。
不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL,其他所有变量的初始值是未定义的。
2.6C++中的变量声明
变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
当使用多个文件且只在其中一个文件中定义变量时,变量声明就显得非常有用。可以使用 extern 关键字在任何地方声明一个变量。虽然可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。
2.7C++中的左值和右值
C++ 中有两种类型的表达式:
- 左值:指向内存位置的表达式被称为左值表达式。左值可以出现在赋值号的左边或右边。
- 右值:右值指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。
2.8C++变量作用域
一般来说有三个地方可以定义变量:
- 在函数或一个代码块内部声明的变量,称为局部变量。
- 在函数参数的定义中声明的变量,称为形式参数。
- 在所有函数外部声明的变量,称为全局变量。
作用域是程序的一个区域,变量的作用域可以分为以下几种:
- 局部作用域:在函数内部声明的变量具有局部作用域,它们只能在函数内部访问。局部变量在函数每次被调用时被创建,在函数执行完后被销毁。
- 全局作用域:在所有函数和代码块之外声明的变量具有全局作用域,它们可以被程序中的任何函数访问。全局变量在程序开始时被创建,在程序结束时被销毁。
- 块作用域:在代码块内部声明的变量具有块作用域,它们只能在代码块内部访问。块作用域变量在代码块每次被执行时被创建,在代码块执行完后被销毁。
- 类作用域:在类内部声明的变量具有类作用域,它们可以被类的所有成员函数访问。类作用域变量的生命周期与类的生命周期相同。
注:如果在内部作用域中声明的变量与外部作用域中的变量同名,则内部作用域中的变量将覆盖外部作用域中的变量。
2.8.1.1局部变量
在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用。
2.8.1.2全局变量
在所有函数外部定义的变量称为全局变量。全局变量的值在程序的整个生命周期内都是有效的。
全局变量可以被任何函数访问,即全局变量一旦声明,在整个程序中都是可用的。
2.8.1.3初始化局部变量和全局变量
局部变量被定义时,系统不会对其初始化,必须自行初始化。 定义全局变量时,系统会自动初始化为下列值:
数据类型 |
初始化默认值 |
int |
0 |
char |
'\0' |
float |
0 |
double |
0 |
pointer |
NULL |
2.8.2.1块作用域
块作用域指的是在代码块内部声明的变量的作用域。
2.8.2.2类作用域
类作用域指的是在类内部声明的变量的作用域。
2.9C++常量
常量是固定值,在程序执行期间不会改变。又叫做字面量。
常量可以是任何的基本数据类型。
常量的值在定义后不能进行修改。
2.9.1.1整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
2.9.1.2浮点常量
浮点常量由整数部分、小数点、小数部分和指数部分组成。可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时,必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
2.9.1.3布尔常量
布尔常量共有两个。
- true值代表真。
- false值代表假。
2.9.1.4字符常量
字符常量是括在单引号中的。
字符常量可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 '\t'),或一个通用的字符(例如 '\u02C0')。
一些转义序列码:
转义序列 |
含义 |
\\ |
\ 字符 |
\' |
' 字符 |
\" |
" 字符 |
\? |
? 字符 |
\a |
警报铃声 |
\b |
退格键 |
\f |
换页符 |
\n |
换行符 |
\r |
回车 |
\t |
水平制表符 |
\v |
垂直制表符 |
\ooo |
一到三位的八进制数 |
\xhh . . . |
一个或多个数字的十六进制数 |
2.9.1.5字符串常量
字符串字面值或常量是括在双引号""中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。
可以使用\做分隔符,把一个很长的字符串常量进行分行。如:
“hello,\
world”
2.9.2定义常量
在 C++ 中,有两种简单的定义常量的方式:
- 使用#define预处理器。
- 使用const关键字。
2.9.3#define预处理器
形式:
#define identifier value
如:
#define PI 3.14
2.9.4const关键字
形式:
const type variable = value;
如:
const int HEIGHT=180;
2.10C++修饰符类型
C++ 允许在char、int和 double数据类型前放置修饰符。
2.10.1.1signed
表示变量可以存储负数。对于整型变量来说,signed 可以省略,因为整型变量默认为有符号类型。
2.10.1.2unsigned
表示变量不能存储负数。对于整型变量来说,unsigned 可以将变量范围扩大一倍。
2.10.1.3short
表示变量的范围比 int 更小。short int 可以缩写为 short。
2.10.1.4long
表示变量的范围比 int 更大。long int 可以缩写为 long。
2.10.1.5long long
表示变量的范围比 long 更大。
2.10.1.6float
表示单精度浮点数。
2.10.1.7double
表示双精度浮点数。
2.10.1.8bool
表示布尔类型,只有 true 和 false 两个值。
2.10.1.9char
表示字符类型。
2.10.1.10wchar_t
表示宽字符类型,可以存储 Unicode 字符。
注:修饰符signed、unsigned、long 和 short可应用于整型,signed和unsigned可应用于字符型,long可应用于双精度型。
这些修饰符也可以组合使用。如:unsigned long int。
C++ 允许使用速记符号来声明无符号短整数或无符号长整数。即可以不写int,只写单词unsigned、short或long。
2.10.2C++中的类型限定符
类型限定符提供了变量的额外信息,用于在定义变量或函数时改变它们的默认行为的关键字。
限定符 |
含义 |
const |
const定义常量,表示该变量的值不能被修改。 |
volatile |
修饰符volatile告诉该变量的值可能会被程序以外的因素改变,如硬件或其他线程。 |
restrict |
由restrict修饰的指针是唯一一种访问它所指向的对象的方式。 |
mutable |
表示类中的成员变量可以在 const 成员函数中被修改。 |
static |
用于定义静态变量,表示该变量的作用域仅限于当前文件或当前函数内, |