https://github.com/huihut/interview#-cc
基础类型
1.枚举,替换define。 默认从零开始逐渐为枚举元素+1初始化
类和对象
- this
类的成员函数体是被所有对象共有; 函数体内访问成员变量通过this->访问 - 成员函数
static,const成员函数==>只能读取成员变量 - 成员变量的初始化顺序
类中成员变量的声明顺序 = 实际初始化的顺序 - 复制构造函数 ==> 注意: 构造函数都是没有返回值的(直接对于私有变零操作, e.g.开辟空间)
Point(const Point& tmp)
Point p1 = p2; - explicit
- 赋值运算符
Point& operator= (const Point& tmp) ==> 需要返回值的; return *this
p3 = p2; - new Point[] delete [] (void*)p
- std::set_new_handler(my_func); 自定义new失败的处理函数
- iostream sstream
- 类内声明 友元函数(访问private成员变量)
模板库
- copy on write
复制时不开辟空间,只有修改时才开辟空间(引用计数 = 当前变量被引用的次数) - template<传入参数>
- Standard Template Library
- container
- iterator
- Adapter
- 函数适配器 bind
- allocator static的对象
- std::move 右值赋值给左值,左值对象不需要新开辟空间。 区别:赋值构造函数=1.释放原有空间 2.开辟新空间 3.深拷贝
- virtual table
- virtual baseClass 虚基类, 继承二义性问题
- virtual func() = 0; ==> 抽象类 ==> 不能创建对象
- virtual ~析构()
- overload; override; oversee;
类型转换
- dynamic_cast ==> 仅在子类指针向上转型到基类指针时合法
- const_cast(expr) ==> 删除expr表达式的const属性
- static_cast(expr) ==> 仅在expr类型可以和T类型做隐式转换时合法 ==> 类似于dynamic_cast??
智能指针
- shared_ptr obj_p(new T(…)) shared_ptr是类,对象obj_p当做指针使用
- weak_ptr obj_p§; p是shared_ptr; weak_ptr设计目的:https://zh.cppreference.com/w/cpp/memory/weak_ptr
系统编程
- 预处理(e.g.宏展开)->编译->汇编->链接(e.g.动态链接库)
- #define add(x, y) (x + y)
- gdb ./a.out a.out.core ulimit -c unlimited
文件操作
- lseek
- struct stat
- FD_ZERO,FD_SET,FD_ISSET
- select(max_fd+1, 读操作集合,写操作集合,NULL,timeout时间) return 就绪的描述字个数
- mmap <==> 避免用户态和内核态频繁的拷贝数据 return 指针指向映射后的空间
进程&管道
- 进程状态的转移图 run->ready or wait
- fork(父子进程执行次序不确定性)==> return 父进程得到子进程的pid;子进程得到0 vfork(子进程先执行)
- waitpid
- fork+setsid 彻底独立=Daemon
- mkfifo 管道通信 int mkfifo(const char *pathname, mode_t mode);
- 共享内存: shmget创建共享内存,返回标识号int;shemat获取标识号的内存,返回内存的头指针; shmdt,shdctl
线程
- pthread_create(pid,func,func的参数) pthread_join(id,pid return val)
- pthread_mutex_t lock;
pthread_mutex_init(&lock, mode属性); - pthread_cond_t cond;
pthread_cond_init(&t.cond,NULL);pthread_cond_signal(&t.cond); pthread_cond_wait(&d->cond,&d->mutex);==>阻塞等待signal
- 协程?资源占据更少,就是小的处理单元,线程也可以调度协程(直观理解: 进程里启很多协程做运算,进程继续执行。 通过共享内存,channel做通信)
- 线程?CPU最小调度单元,(同一进程内可以互相通信,全双工半双工)
- CPU调度: 抢占式轮转调度 非抢占:先来后到Queue,优先级排序 其它:多级反馈队列,不同队列的调度策略不同。动态调整其进程所在队列
- Epoll: epoll create; epoll ctl; epoll_wait(返回监听的事件数目)
- C++: 防止内存的泄露的方法?
- 进程线程通信机制
- C++和C在编译器的不同
- 计算机网络: 应用层(http,SMTP,FTP) ==> 传输层(TCP.UDP)socket? ==> 网络层(IP,ARP数据的打包) ==> 数据链路层
- 用户态 -------系统调用------> 内核态
################################################################# C++ 11
- lambda表达式
外部参数捕获{计算 + 返回}
e.g. [my_ize](const string& i, const string& j){ return (i+j).size()>my_size?1:0; }
e.g. std::sort(vector.begin(),vector.end(), [](const T& i, const T& j){return i > j;} - exception stack = 异常的捕获,不断向上返回异常