C:
- C语言的基本模块是函数
- C语言的struct默认public,不是类,没有函数,也没有public和static关键字;C++struct默认private,有构造析构等函数
- C语言也有pragma指令,用于向编译器提供特定的指示或命令
C++基础:
- 一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值
- 指针在32位平台为4字节,64为平台为8字节,char为1个字节,int为4个字节
- 内联函数在编译时将该函数的目标代码插入每个调动该函数的地方,优化了运行效率
- const修饰,左定值,右定向,只有变量才能赋值给非const引用类型,而常量可以赋值给const引用类型
- catch捕获异常后,可以再次用throw抛出
- 将小的数据类型转化为大的数据类型,不会出现问题,一般只是转化后所占用的字节更多了,但是要将大的数据类型转化为小的数据类型的话,就会造成数据的丢失
- ①联合中只存放了一个被选中的成员(所有成员共用一块地址空间),对一个union变量改变,其他都会改变;结构的所有成员都存在(不同成员的存放地址不同);②联合可以被初始化,但初始化值必须是联合第一个成员的类型;③内存大小是联合内成员最大值,结构体(内存对齐,紧挨前一个变量进行填充)
- 运算顺序为先括号,再四则,再移位运算,再位运算
- 位运算的对象只能是整型或字符型数据,负数右移运算高位补1
- a+++b=a+(++b);a++操作通过临时常量返回值,不是左值,所以不能修改或引用
- malloc分配内存失败时会返回空指针,C++会抛出BAD_ALLOC异常
- 野指针产生的原因①声明的指针未被初始化②free或delete掉的指针未被置NULL,指针指向垃圾内存
- 分支结构分为单分支(if)与多分支(if else)
- 本函数可以调用下面定义的函数,但是要在之前声明
- int (*fun)(int *)是函数指针,指向函数的指针变量,即本质是一个指针变量。 int* fun(int *) 指针函数是指返回指针的函数,即本质是一个函数。
- 整型变量分为int,short,long,unsigned
- 八进制数用0开头,二进制为0b/0B,十六进制0x/0X
- 小端模式:高位存高地址,低位存低地址,也就是权重大的存在高地址值
- 补码为反码加1,反码为原码除了符号位取反
- 显式转换static_cast编译时直接检查括号内类型,dymamic_cast运行时检查表达式指针所指向的对象类型
- 对于宏的使用先替换,再按优先级计算,不要自己加括号
- 变量声明不分配空间,定义分配空间,函数的形参属于局部变量
C++核心:
- ①友元一般定义在类外部,在类外定义友元时不必加friend,但在类内声明时需要用friend声明②友元函数不是成员函数,不需要用类作用域符号标识该函数属于哪个类,不能被继承③类A友元函数可以访问A的私有成员,类A的友元类B可以访问A的私有成员
- ①静态数据成员是类所有对象共有的;②静态成员变量必须在类内声明,在类外初始化;③静态成员变量或静态成员函数可通过实例化对象/类名访问。
- ①引用不可以为空,创建时必须初始化,指针可以是空值;②指针可以改变指向,引用不可以;③sizeof引用得到所指的变量大小,sizeof指针得到指针本身大小
- ①栈区:局部变量和函数参数值;②堆区:malloc和new动态申请的内存;③代码区:函数体中二进制代码;④全局区:全局变量和静态变量
- protect成员被公有/保护继承后只能在派生类内访问,不能通过类的对象访问;private类内类外都不能访问
- 虚函数可以是(普通成员函数,析构函数),不可以是(构造函数,静态成员函数,友元函数,内联函数),构造函数不能声明为虚函数。
- this只对本类的非静态成员有效,对静态的成员变量没有作用,因为静态属于类,而不属于具体对象,所以使用this会导致不确定对象而出错
- 类为空时,编译器分配的函数都是public,分配构造函数,析构函数,拷贝构造函数,赋值重载函数(d2 = d1),类指针的声明不会调用构造函数
- 析构函数可以在类内声明,类外定义
- 定义派生类的对象时先调用父亲的构造函数,再调用成员的构造函数,最后派生类的构造函数:先父亲,再客人,最后自己
- 虚函数表在变量区,shareptr在栈区。
提高(STL):
- 关联容器是树结构(set,map为红黑树rb-tree),无序关联容器基于哈希表(unordered_set。unordered_map为哈希表)
- List底层是双向链表,在当前结点前后插入新元素的效率为O(1),当然如果需要有序插入的话,还是会退化为O(n),因为需要遍历比较元素值
- Vector底层是动态数组,把数组的常用操作封装起来,方便使用,插入性能为O(n),尾插为O(2),需要注意的是,数组的空间是有限的,空间用尽时会进行扩容,因此平均下来性能比list要差一点点
- deque双端队列,主要是和 vector 相比较,从头部插入的性能优于vector,同样也有扩容机制,头尾平均插入效率O(2)
- set底层是红黑树,要求存储的数据是可以比较的,存储元素不能重复,插入性能是log(n),树的平衡调整规则会有一定的开销
- map底层是红黑树+哈希表,存储的数据类型是 pair(键值对),和set相比,map对存储的值要求没那么高,而把要求转移到键上(键不能重复),插入效率log(n)
- pair通常是map的存储数据类型,只能存储两个值
- priority_queue优先队列底层是个堆结构(大小顶堆),实刻保证队首元素是当前的极值,因此可以拿来排序,插入性能也是log(n);
- 类模板和函数模板的实例化都是由编译器实现的;类模板实例化后,没有用到的成员函数模板没有实例化;类模板中的成员函数都是函数模板
C++新特性:
- shared_ptr本身是安全且无锁,①一个shared_ptr对象可以被多个线程同时读取②两个shared_ptr对象可以被两个线程同时写入,析构算写操作③如果从多个线程读写同一个shared_ptr对象,需要加锁。