[刷题]编程语言[1.15]

C:

  1. C语言的基本模块是函数
  2. C语言的struct默认public,不是类,没有函数,也没有public和static关键字;C++struct默认private,有构造析构等函数
  3. C语言也有pragma指令,用于向编译器提供特定的指示或命令

C++基础:

  1. 一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值
  2. 指针在32位平台为4字节,64为平台为8字节,char为1个字节,int为4个字节
  3. 内联函数在编译时将该函数的目标代码插入每个调动该函数的地方,优化了运行效率
  4. const修饰,左定值,右定向,只有变量才能赋值给非const引用类型,而常量可以赋值给const引用类型
  5. catch捕获异常后,可以再次用throw抛出
  6. 将小的数据类型转化为大的数据类型,不会出现问题,一般只是转化后所占用的字节更多了,但是要将大的数据类型转化为小的数据类型的话,就会造成数据的丢失
  7. ①联合中只存放了一个被选中的成员(所有成员共用一块地址空间),对一个union变量改变,其他都会改变;结构的所有成员都存在(不同成员的存放地址不同);②联合可以被初始化,但初始化值必须是联合第一个成员的类型;③内存大小是联合内成员最大值,结构体(内存对齐,紧挨前一个变量进行填充)
  8. 运算顺序为先括号,再四则,再移位运算,再位运算
  9. 位运算的对象只能是整型或字符型数据,负数右移运算高位补1
  10. a+++b=a+(++b);a++操作通过临时常量返回值,不是左值,所以不能修改或引用
  11. malloc分配内存失败时会返回空指针,C++会抛出BAD_ALLOC异常
  12. 野指针产生的原因①声明的指针未被初始化②free或delete掉的指针未被置NULL,指针指向垃圾内存
  13. 分支结构分为单分支(if)与多分支(if else)
  14. 本函数可以调用下面定义的函数,但是要在之前声明
  15. int (*fun)(int *)是函数指针,指向函数的指针变量,即本质是一个指针变量。 int* fun(int *) 指针函数是指返回指针的函数,即本质是一个函数。
  16. 整型变量分为int,short,long,unsigned
  17. 八进制数用0开头,二进制为0b/0B,十六进制0x/0X
  18. 小端模式:高位存高地址,低位存低地址,也就是权重大的存在高地址值
  19. 补码为反码加1,反码为原码除了符号位取反
  20. 显式转换static_cast编译时直接检查括号内类型,dymamic_cast运行时检查表达式指针所指向的对象类型
  21. 对于宏的使用先替换,再按优先级计算,不要自己加括号
  22. 变量声明不分配空间,定义分配空间,函数的形参属于局部变量

C++核心:

  1. ①友元一般定义在类外部,在类外定义友元时不必加friend,但在类内声明时需要用friend声明②友元函数不是成员函数,不需要用类作用域符号标识该函数属于哪个类,不能被继承③类A友元函数可以访问A的私有成员,类A的友元类B可以访问A的私有成员
  2. ①静态数据成员是类所有对象共有的;②静态成员变量必须在类内声明,在类外初始化;③静态成员变量或静态成员函数可通过实例化对象/类名访问。
  3. ①引用不可以为空,创建时必须初始化,指针可以是空值;②指针可以改变指向,引用不可以;③sizeof引用得到所指的变量大小,sizeof指针得到指针本身大小
  4. ①栈区:局部变量和函数参数值;②堆区:malloc和new动态申请的内存;③代码区:函数体中二进制代码;④全局区:全局变量和静态变量
  5. protect成员被公有/保护继承后只能在派生类内访问,不能通过类的对象访问;private类内类外都不能访问
  6. 虚函数可以是(普通成员函数,析构函数),不可以是(构造函数,静态成员函数,友元函数,内联函数),构造函数不能声明为虚函数。
  7. this只对本类的非静态成员有效,对静态的成员变量没有作用,因为静态属于类,而不属于具体对象,所以使用this会导致不确定对象而出错
  8. 类为空时,编译器分配的函数都是public,分配构造函数,析构函数,拷贝构造函数,赋值重载函数(d2 = d1),类指针的声明不会调用构造函数
  9. 析构函数可以在类内声明,类外定义
  10. 定义派生类的对象时先调用父亲的构造函数,再调用成员的构造函数,最后派生类的构造函数:先父亲,再客人,最后自己
  11. 虚函数表在变量区,shareptr在栈区。

提高(STL):

  1. 关联容器是树结构(set,map为红黑树rb-tree),无序关联容器基于哈希表(unordered_set。unordered_map为哈希表)
  2. List底层是双向链表,在当前结点前后插入新元素的效率为O(1),当然如果需要有序插入的话,还是会退化为O(n),因为需要遍历比较元素值
  3. Vector底层是动态数组,把数组的常用操作封装起来,方便使用,插入性能为O(n),尾插为O(2),需要注意的是,数组的空间是有限的,空间用尽时会进行扩容,因此平均下来性能比list要差一点点
  4. deque双端队列,主要是和 vector 相比较,从头部插入的性能优于vector,同样也有扩容机制,头尾平均插入效率O(2)
  5. set底层是红黑树,要求存储的数据是可以比较的,存储元素不能重复,插入性能是log(n),树的平衡调整规则会有一定的开销
  6. map底层是红黑树+哈希表,存储的数据类型是 pair(键值对),和set相比,map对存储的值要求没那么高,而把要求转移到键上(键不能重复),插入效率log(n)
  7. pair通常是map的存储数据类型,只能存储两个值
  8. priority_queue优先队列底层是个堆结构(大小顶堆),实刻保证队首元素是当前的极值,因此可以拿来排序,插入性能也是log(n);
  9. 类模板和函数模板的实例化都是由编译器实现的;类模板实例化后,没有用到的成员函数模板没有实例化;类模板中的成员函数都是函数模板

C++新特性:

  1. shared_ptr本身是安全且无锁,一个shared_ptr对象可以被多个线程同时读取两个shared_ptr对象可以被两个线程同时写入,析构算写操作如果从多个线程读写同一个shared_ptr对象,需要加锁。
  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值