C++ 基础
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程
C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。
发布时间 | 文档 | 通称 | 备注 |
---|---|---|---|
2015 | ISO/IEC TS 19570:2015 | - | 用于并行计算的扩展 |
2015 | ISO/IEC TS 18822:2015 | - | 文件系统 |
2014 | ISO/IEC 14882:2014 | C++14 | 第四个C++标准 |
2011 | ISO/IEC TR 24733:2011 | - | 十进制浮点数扩展 |
2011 | ISO/IEC 14882:2011 | C++11 | 第三个C++标准 |
2010 | ISO/IEC TR 29124:2010 | - | 数学函数扩展 |
2007 | ISO/IEC TR 19768:2007 | C++TR1 | C++技术报告:库扩展 |
2006 | ISO/IEC TR 18015:2006 | - | C++性能技术报告 |
2003 | ISO/IEC 14882:2003 | C++03 | 第二个C++标准 |
1998 | ISO/IEC 14882:1998 | C++98 | 第一个C++标准 |
类型
类型 | 关键字 |
---|---|
布尔型 | bool |
字符型 | char |
整型 | int |
浮点型 | float |
双浮点型 | double |
无类型 | void |
宽字符型 | wchar_t |
类型 | 位 | 范围 |
---|---|---|
char | 1 个字节 | -128 到 127 或者 0 到 255 |
unsigned char | 1 个字节 | 0 到 255 |
signed char | 1 个字节 | -128 到 127 |
int | 4 个字节 | -2147483648 到 2147483647 |
unsigned int | 4 个字节 | 0 到 4294967295 |
signed int | 4 个字节 | -2147483648 到 2147483647 |
short int | 2 个字节 | -32768 到 32767 |
unsigned short int | 2 个字节 | 0 到 65,535 |
signed short int | 2 个字节 | -32768 到 32767 |
long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
signed long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
unsigned long int | 8 个字节 | 0 to 18,446,744,073,709,551,615 |
float | 4 个字节 | +/- 3.4e +/- 38 (~7 个数字) |
double | 8 个字节 | +/- 1.7e +/- 308 (~15 个数字) |
long double | 8 个字节 | +/- 1.7e +/- 308 (~15 个数字) |
wchar_t | 2 或 4 个字节 | 个宽字符 |
typedef
使用 typedef
为一个已有的类型取一个新的名字。
1 | typedef int feet; |
枚举
1 | enum color { red=3, green, blue } c; |
变量
可以使用 extern
关键字在任何地方声明一个变量
1 | extern int d = 3, f = 5; // d 和 f 的声明 |
常量
- 使用
#define
预处理器 - 使用
const
关键字
1 | #define LENGTH 10 |
数组
1 | double balance[10]; |
判断
1 | // if else |
循环
break 终止循环,且程序流将继续执行紧接着循环的下一条语句。
break 用于终止 switch 语句中的一个 case。
continue 会跳过当前循环中的代码,强迫开始下一次循环。
1 | // while 循环执行 |
运算符
算术运算符:+ - * / % ++ --
%
取模运算符,整除后的余数
关系运算符:== != > < >= <=
逻辑运算符:&& || !
位运算符:& | ^ ~ << >>
^
如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中~
二进制补码运算符是一元运算符,具有”翻转”位效果,即0变成1,1变成0。<<
二进制左移运算符,按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。左移n位就相当于乘以2的n次方。>>
二进制右移运算符,按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。右移n位相当于除以2的n次方。
赋值运算符:= += -= *= /= %= <<= >>= &= ^= |=
函数
函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。
传值调用
传值调用方法,把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
1 | // 声明 |
指针调用
指针调用方法,把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
1 | // 函数定义 |
引用调用
引用调用方法,把参数的地址复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
1 | // 函数定义 |
Lambda 表达式
C++11 提供了对匿名函数的支持,称为 Lambda 函数(也叫 Lambda 表达式)。
Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。
在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为。 与JavaScript闭包不同,C++变量传递有传值和传引用的区别。可以通过前面的[]来指定
1 | /* |
指针 *
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。
通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值
所有指针的值的实际数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。
指针所指向的变量或常量的数据类型不同。
1 | #include <iostream> |
引用 &
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
1 | int i = 17; |
输入输出
1 | // 预定义的对象 cerr 是 ostream 类的一个实例。cerr 对象附属到标准错误设备,通常也是显示屏,但是 cerr 对象是非缓冲的,且每个流插入到 cerr 都会立即输出。 |
数据结构(结构体)
1 | #include <iostream> |
面向对象
类
C++ 在 C 语言的基础上增加了面向对象编程
类的基本概念
1 | #include <iostream> |
继承、多态
1 | #include <iostream> |
进阶
文件流
标准库 fstream
ofstream
该数据类型表示输出文件流,用于创建文件并向文件写入信息。ifstream
该数据类型表示输入文件流,用于从文件读取信息。fstream
该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。
open() 成员函数的第一参数指定要打开的文件的名称和位置,第二个参数定义文件被打开的模式。
ios::app
追加模式。所有写入都追加到文件末尾。ios::ate
文件打开后定位到文件末尾。ios::in
打开文件用于读取。ios::out
打开文件用于写入。ios::trunc
如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。
1 | #include <iostream> |
异常处理
1 | #include <iostream> |
内存
1 | #include <iostream> |
命名空间
1 | #include <iostream> |
泛型
函数
1 | #include <iostream> |
类
1 | #include <iostream> |
预处理
预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。
所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。
1 | #include <iostream> |
信号处理(我的理解是swift中的通知)
1 | #include <iostream> |
多线程
1 | #include <iostream> |
1 | #include <iostream> |
CGI
未整理
标准库
C++ 标准库包含了所有的 C 标准库,为了支持类型安全,做了一定的添加和修改。
标准函数库
这个库是由通用的、独立的、不属于任何类的函数组成的。函数库继承自 C 语言。
- 输入/输出 I/O
- 字符串和字符处理
- 数学
- 时间、日期和本地化
- 动态分配
- 其他
- 宽字符函数
面向对象类库
这个库是类及其相关函数的集合。
- 标准的 C++ I/O 类
- String 类
- 数值类
- STL 容器类
- STL 算法
- STL 函数对象
- STL 迭代器
- STL 分配器
- 本地化库
- 异常处理类
- 杂项支持库
个人补充
->
和 .
->
前面是指针,.
前面是变量
域运算符 ::
- 不能把静态成员放置在类的定义中,但是可以在类的外部通过使用
范围解析运算符 ::
来重新声明静态变量从而对它进行初始化, - 成员函数可以定义在类定义内部,或者在类外单独使用
范围解析运算符 ::
来定义 - 如果有个局部变量与全局变量同名
::a
可以使用全局变量 ::
只能访问静态成员函数std::cout
表示 cout 是在 std 中的变量using std::cout
只使用 std 命名空间中的 cout 部分 std 命名空间中的其他项目仍然需要加上命名空间名称作为前缀,如std::endl
::
左边一定是类名/命名空间,右边一定是变量名/函数名,左侧没有东西的时候,代表右侧的函数/变量是全局的
*
指针 和 &
引用
&
在定义变量的时候是引用,起标识作用,如int &a = b;
a为b的一个引用,
引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名。
声明一个引用,不是新定义了一个变量,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。
不能建立数组的引用&
在表达式中为取地址,你的地址可以是任何类型 如int *a = &b;
a为指向b整型的一个指针*
是指针,是取地址的内容
include ""
和 include <>
引号会先在程序所在的路径里找(自定义的库函数)
尖括号是从系统的头文件开始找(标准库函数)