01 c++是什么?
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程;C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点;C++ 是 C 的一个超集任何合法的 C 程序都是合法的 C++ 程序。
注意:使用静态类型的编程语言是在编译时执行类型检查,而不是在运行时执行类型检查。
02 其四大特性:封装、抽象、继承、动态
03 最新标准2017年c++17,是第五个c++标准
04 大多数C++编译器不在乎源文件的扩展名,如果未指定扩展名,则默认使用.cpp
05 using namespace std;告诉编译器使用std命名空间,命名空间是c++中的概念
06 完整关键字查询见https://www.runoob.com/w3cnote/cpp-keyword-intro.html
07 由于/*...*/不可以嵌套使用,可以使用以下方法实现注释,且可以实现嵌套:
#if 0 code #endif
08 typedef可以为一个已有的类型取一个新名字
09 enum枚举,在枚举列表中列出变量所有可能的值,默认情况下第一个名称的值为0,第二个名称的值为1,且后一个默认的值总只比前面一个变量大1;
enum 枚举名{ 标识符[=整型常量] }枚举标量;
10 变量是程序可操作的存储区的名称,类型主要作用是指定变量存储的大小和布局
11 定义常量常采用两种方法,特别注意常量使用大写字母表示;
使用#define预处理器;
使用const关键字;
12 修饰符类型:修饰符 signed、unsigned、long 和 short 可应用于整型,signed 和 unsigned 可应用于字符型或long与short修饰符的前置,long 可应用于双精度型
13 不常用修饰符:const类型的对象程序执行期间不能被修改改变,volatile表示该变量不需要对改变了进行优化(一般会将变量从内存放在寄存器中加快读取速度),直接从内存读取读取,restrict修的指针是唯一一种访问它所指向对象的方式;
14 存储类定义定义了变量或函数的范围与生命周期。这些说明符放置在它们所修饰的类型之前。常有存储类有auto、register、static、extern、mutable(易变的)、thread_local,注意从c++17标准之后auto关键字不再是c++存储类说明符,且register关键字被弃用;
15 auto在c++98标准中表示自动变量的声明,这一作用在c++11标准中弃用,c++11标准以来,auto主要有两个作用,声明变量时依据初始值自动推导变量类型,一次推导只能推导同类型变量、声明函数时,自动推导函数返回值的占位符;
16 register存储类用于定义存储在寄存器而不是ram的局部变量,变量的最大尺寸等于寄存器的大小,其不能不其使用一元运算符,在c++17中,该关键字被弃用;
17 static指示编译器在程序的生命周期中保持局部变量的存在,而不需要在每次进入和离开作用域时进行创建和销毁:下面代码中i随着首次调用创建为5,之后值为6、7、8.......
void fun() { static int count =5; i++; }
18 extern存储类主要作用是在另一个文件中声明一个全局变量或者函数;
19 thread_local存储类,使用该修饰符的变量只可以在其创建的线程上访问,变量在线程创建时创建,在销毁时销毁,每个线程都有其自己的变量副本;
20 运算符:算术、关系、逻辑、位、赋值、杂项运算符
22 逻辑且&&、或||、非!;位运算符与&、或|、异或^、取反~、左移运算符<<、右移运算符>>;
23 杂项运算符:sizeof返回的是变量的大小的运算符,注意是变量,不是值的长度、condition?x:y、,逗号运算符表示整个逗号表达式的值为逗号分隔列表最后一个表达式的值;成员运算符.和->、强制转换运算符、&取地址运算符、*指针运算符;
24 运算符优先级中需注意移位运算符低于加减,
25 无线循环while(1)与for( ; ; ),无线循环采用ctrl+c键终止无限循环;
26 函数传值调用,指针调用传指针,引用调用传地址;
27 c++11提供了匿名函数的支持,称为Lambda函数,
28 c++提供了丰富的内置数学函数,头文件<cmath>,log取对数,pow乘方,hypot直角三角形求斜边,sqrt求根,abs求整数绝对值,fabs浮点数的绝对值,floor求小于或等于该值的最大整数;
29 随机数,先调用srand()生成种子,然后调用rand()函数,
30 strcpy(s1, s2) 复制上s2到s1后面;strcat(s1, s2)连接字符串s2到s1末尾;strlen(s1)返回字符串的长度,sizeof是变量的长度,注意区分;
31 extern "C" { } 的目的是为了在c++代码中调用c写成的库文件;而C想调用C++函数,则需要用包裹函数去包裹C++函数,然后把这个包裹函数以C的规则进行编译,于是c就可以调用这个包裹函数;
eg::
// world.cpp
#include <iostream> void world() { std::cout << "world" << std::endl; }
执行g++ --shard -o libworld.so world.cpp
cp libworld.so /lib/
// mid.cpp
#include <iostream> void world(); #ifdef __cplusplus // 开始包裹 extern "C" { // 即使这是一个C++程序,下列这个函数的实现也要以C约定的风格来搞! #endif void m_world() { world(); } #ifdef __cplusplus // 包裹介绍 } #endif
执行:g++ --share -o libmid.so mid.cpp -lworld
cp libmid.so /lib/
.c程序通过链接二次接口去调用C++库
// test.c
#include <stdio.h> int main(){ m_world(); return 0; }
32
- 算法库(Algorithms library)
浅解:提供对容器及序列进行算法操作的函数。大部分由头文件 <algorithm> 提供,小部分由 <numeric>、<cstdlib> 提供。
eg:排序操作、二分法查找操作、集合操作、堆操作。
- fstream类总结
ofstream(output file stream), ifstream, fstream
在头文件fstream中,在fstream类中,用open成员函数打开文件,实现类与文件的关联操作。
- open(filename, mode, prot):对所属类进行用指定的参数进行特定的文件关联
打开方式(mode):(这些方式可以用 '|' 组合起来)
ios::in | 打开输入(读)文件 |
ios::out | 打开输出(写)文件 |
ios::ate | 初始位置为文件头 |
ios::app | 所有写入附加文件尾部 |
ios::trunc | 如果文件已存在,删除 |
ios::binary | 以二进制打开 |
打开属性(prot):(可以采用'+'进行组合)
0 | 普通文件,打开操作 |
1 | 只读文件 |
2 | 隐含文件 |
4 | 系统文件 |
- close() //关闭文件
- 时间相关库(chrono)
浅解:主要包含 时间间隔Duration、时钟Clocks和时间点Time point
- iomanip库
应用情况:从文本中提取指定个数的字符串,并在串数组尾添加一个空格
C++11标准新特性简记
最近,学Vslam时遇到许多陌生用法,即为C++11,于此简记之。
引自:https://blog.csdn.net/jiange_zh/article/details/79356417
1.nuiiprt
C++11引入nullptr是为了解决NULL即可定义为空指针,又可定义为0的混乱情况。
2.auto与decltype
auto常用于推算左值的类型,decltype是推算某公式用于另值的声明,细则点链接;
eg:auto pd = 0.618033; //pd的类似为double
decltype(yx + pd) h; //h的类型为公式加法值类型
3.尖括号 “ >”
c数组:
数组名表示首行首元素地址,步长为元素;&数组名表示数组首行首地址,步长为整个数组。
首行首地址变为首行首元素地址:*&数组名,*&相当于相互抵消。
数组指针是指向数组的指针变量:typedef int AC [10]; AC *p;不常用
()[]同级,优先级从左往右;()有*,它是一个指针,[]代表数组;指向数组的指针变量,[]中的数字代表指针+1的步长,int (*p)[10]; p = &a; 常用。
typedef int (*p)[10];p d; 常用
多维数组名是一个数组指针,指向数组的指针,步长为一行字节长度,相当于一维的&数组名;
注意,数组指针定义时一维数组p = &a;多维数组p = a;
做形参时,一维数组名退化为指针,多维数组名退化为数组指针;数组指针可以指定步长;
指针数组(是一个数组,只是每个元素都是指针)
[]优先级比*高 : char *str[] = {''22'', ''33''};
常用字符串处理函数
strstr、strcmp、strcpy
手工二维内存
char **p3 = (char **)malloc(3 * sizeof(char *));
for(i = 0;i < 3;i++)
{
p3[i] = (char *)malloc(3 * sizeof(char *));
}
服务器项目:https://github.com/linyacool/WebServer
谁终将声震人间,必长久深自缄默;谁终将点燃闪电,必长久如云漂泊。