C++
-
C++ 和C的主要區別
C語言是面向過程編程,C++是面向對象編程,C++ 完全兼容C
-
C++有哪些特性,簡述對他們的理解
封裝、繼承、多態
封裝
將的事物抽象成一個個集合(也就是所說的類),實現代碼的模塊化
繼承
子類可以繼承父類的方法,實現代碼重用
多態
子類繼承父類之后,父類指針指向子類對象,實現接口重用
-
引用和指針的區別
- 引用是變量的一個別名,內部實現是只讀指針
- 引用只能在初始化時被賦值,其他時候值不能被改變,指針的值可以在任何時候被改變
- 引用不能為NULL,指針可以為NULL
- 引用變量內存單元保存的是被引用變量的地址
- “sizeof 引用" = 指向變量的大小 , "sizeof 指針"= 指針本身的大小
- 引用可以取地址操作,返回的是被引用變量本身所在的內存單元地址
- 引用使用在源代碼級相當於普通的變量一樣使用,做函數參數時,內部傳遞的實際是變量地址
-
重載和重寫的區別
重載:是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。
重寫:是指子類重新定義父類虛函數的方法。
-
C++ delete和delete[]的區別
delete只會調用一次析構函數,而delete[]會調用每一個成員的析構函數
-
const與#define 相比,有何優點?
const作用:定義常量、修飾函數參數、修飾函數返回值三個作用。被Const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性
const 常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,並且在字符替換可能會產生意料不到的錯誤
-
關鍵字static的作用
- 可以用於全局變量的定義:為該變量分配靜態存儲區。程序運行結束前不會被釋放。
- 聲明和定義靜態成員函數:表示該函數為靜態函數,只能在本文件中被調用。
- 定義靜態局部變量:只被初始化一次,只有程序運行結束才會釋放。區別是作用域的范圍
C++ - STL
-
使用過哪些STL容器
vector,list,deque,map,multimap,set,multiset
-
使用過那些算法
查找算法、排序算法、消除算法、計數算法、比較算法、變換算法、置換算法和容器管理等
Linux
-
使用過哪些linux命令
文件管理命令 磁盤管理命令 網絡通信命令 系統管理命令 備份壓縮命令 cat cd ifconfig ps bzip2 cp ls iptables free gzip rm mkdir netstat kill tar find pwd ping yum unzip -
linux下多進程和多線程的區別
線程具有許多傳統進程所具有的特征,故又稱為輕型進程(Light—Weight Process)或進程元;而把傳統的進程稱為重型進程(Heavy—Weight Process),它相當於只有一個線程的任務。在引入了線程的操作系統中,通常一個進程都有若干個線程,至少包含一個線程。
根本區別:進程是操作系統資源分配的基本單位,而線程是處理器任務調度和執行的基本單位
資源開銷:每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(PC),線程之間切換的開銷小。
包含關系:如果一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,所以線程也被稱為輕權進程或者輕量級進程。
內存分配:同一進程的線程共享本進程的地址空間和資源,而進程之間的地址空間和資源是相互獨立的
影響關系:一個進程崩潰后,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。
執行過程:每個獨立的進程有程序運行的入口、順序執行序列和程序出口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制,兩者均可並發執行
-
進程間通信的方式有哪些
管道
共享內存
套接字
內存映射
信號(一般不用,優先級太高容易打斷程序正常執行,且攜帶信息量小)
QT
-
使用過哪些QT控件
Widget
dialog
Box
button
...
-
使用過哪些QT事件
keyboard 鍵盤事件
mouse 鼠標事件
timer 定時器事件
...
-
QT信號槽機制的優缺點
優點
- QT信號槽機制的引用精簡了程序員的代碼量 (不用寫回調函數)
- QT的信號可以對應多個槽(但他們的調用順序隨機),也可以多個槽映射一個信號
- QT的信號槽的建立和解除綁定十分自由
缺點
- 信號槽同真正的回調函數比起來時間的耗損還是很大的,所有在嵌入式實時系統中應當慎用
- 信號槽的參數限定很多例如不能攜帶模板類參數,不能出現宏定義等等
-
QT下UDP和TCP的通信流程
QT下udp通信服務器端和客戶端的關系是對等的, 做的處理也是一樣的
- 創建套接字對象
- 如果需要接收數據, 必須綁定端口
- 發送數據: writeDatagram
- 接收數據: readDatagram
TCP
服務器端:
- 創建用於監聽的套接字
- 給套接字設置監聽
- 如果有連接到來, 監聽的套接字會發出信號newConnected
- 接收連接, 通過nextPendingConnection()函數, 返回一個QTcpSocket類型的套接字對象(用於通信)
- 使用用於通信的套接字對象通信
- 發送數據: write
- 接收數據: readAll/read
客戶端:
- 創建用於通信的套接字
- 連接服務器: connectToHost
- 連接成功與服務器通信
- 發送數據: write
- 接收數據: readAll/read
CODE
-
寫出下列程序執行后的結果
#include <iostream.h> class A { virtual void g() { cout << "A::g" << endl; } private: virtual void f() { cout << "A::f" << endl; } }; class B : public A { void g() { cout << "B::g" << endl; } virtual void h() { cout << "B::h" << endl; } }; typedef void( *Fun )( void ); void main() { B b; Fun pFun; for(int i = 0 ; i < 3; i++) { pFun = ( Fun )*( ( int* ) * ( int* )( &b ) + i ); pFun(); } } /* 輸出結果: B::g A::f B::h */
-
寫出下列程序執行后的結果
#include <iostream.h> main() { int x[]= {10, 20, 30, 40, 50 }; int *p; p=x; cout << *(p+2) << endl; } /* 運行結果為: 30 */