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 = 異常的捕獲,不斷向上返回異常