c 復習
什麽是指針?舉例說明指針數組和數組指針的區別。
指針: 定義(類型名變量名), 用於保存地址, 地址保存的值類型和指針相同
數組指針: 指向數組的指針 類型 ( 變量名)[長度] = 類型 變量名[XX][列(長度)]
指針數組: 保存指針的數組 基本類型* 變量名[長度]
字符串指針和字符串數組有什麽區別,請詳細說明。
char *p = "12345678"; // p是指針,p可以改變, sizeof(p):4 , "12345678"在常量數據區
char p[] = "12345678"; // p是數組,p本身不可以改變 sizeof(p):9 賦值完成後"12345678"放在棧區
可以對指針進行哪些操作,分別會產生怎樣的效果。
p+整數: p + sizeof(指向的類型) 整數 0x00 + 1 = 0x00 + sizeof(int)1 = 0x04
p-整數: p - sizeof(指向的類型) 整數 0x04 - 1 = 0x04 - sizeof(int)1 = 0x00
p-指針: 兩個元素差了多少個元素
++/--: 和 +整數 -整數一樣
什麽是數組,說明數組的基本特征。
數組就是用於連續存儲相同類型數據的一種結構
從內存角度解釋數組在函數傳參過程中發生了哪些變化。
當將一個數組作為參數傳入函數的時候,會進行退化
退化為指向數組首元素地址的指針,所以說,這個指針的大小是4
數組和指針是怎樣進行相互轉化的,它們之間有什麽區別?
char n[10], pn = n(&n[0]); // char
n[0] == (pn+0) == pn[0]
char n[10][10], (pn)[10] = n(&n[0]); // char[10]
n[1][2] == (*(pn+1)+2) == pn[1][2]
使用一個函數一般分為幾個步驟,分別是什麽?
聲明函數 -> 定義函數 -> 調用函數
默認形參是什麽,如何為一個函數添加默認形參
默認形參用於被經常使用但又有少數情況需要其他值的情況。
默認形參可以在函數聲明或函數定義的時候添加
在C++中引用和指針有什麽異同,如何定義他們。
定義指針(*),定義引用使用(&)
異: 語法規則上引用沒有地址,引用不能引用引用,引用必須初始化,引用只能引用一個變量
同: 都可以在函數中修改形參
在C++中函數的傳參方式有幾種,分別是什麽?
傳地址、傳引用、傳值
面向對象的基本特性是什麽,分別體現在哪裏?
封裝:訪問屬性
繼承: 繼承
多態: 虛函數、函數重載、模板
在不同權限的繼承中,基類成員的訪問權限在子類中會產生哪些變化?
public private protected
public public 不被繼承 protected
private private 不被繼承 private
protected protected 不被繼承 protected
例舉出常用的字符串操作函數以及它的作用<string.h>。
strlen() - 獲取字符串長度
strcpy() - 拷貝字符串
strcmp() - 比較字符串
strcat() - 拼接字符串
strtok() - 字符串切割
怎樣定義和使用一個虛函數,析構函數為什麽最好被定義為虛函數。
在成員函數前加virtual關鍵字。
避免產生內存泄漏。
當類中存在虛函數時,它會產生哪些變化。
它的首地址位置會多出一個虛表指針,指向的是一個保存當前類所有虛函數的虛表
內存角度上,類對象的大小多了指針的長度
什麽情況下會使用到虛繼承,使用的格式是什麽
用於消除菱形繼承產生的二義性。
class A{ public: int n;}
class B: public A{ }
class C: public A{ }
class D : public virtual B, virtual public C { }
函數重載是什麽,進行重載時有哪些要求。
函數重載可用於實現多態,它可以使相同的函數接收不同的參數
要求: 參數個數、參數類型不同,只有返回值不同的不可以重載
重寫、重載和覆蓋分別是什麽,請詳細說明。
重寫(作用域不同): 虛函數, 完全相同
重定義(作用於不同):子類函數名和父類相同
重載(作用域相同):函數名相同,函數特征不同
運算符重載有幾種形式,一般使用哪種形式,有哪些運算符不能被重載。
友元重載(<< >>)\推薦使用成員重載
. ,: :: -> sizeof
怎樣使用模板,模板特化與模板偏特化分別是什麽,函數為什麽沒有偏特化?
template<class/typename T, ...>
模板特化: 針對於特殊類型特化所有的T類型
模板偏特化: 針對於特殊類型特化部分的T類型
函數的偏特化其實就是函數重載
new\malloc 和 delete\free有什麽區別。
new\delete 會調用構造和析構
new\delete 是運算符
new 會返回指定類型的對象,malloc是void*
使用宏有哪些需要註意的地方,怎樣避免出現這樣的情況。
宏沒有類型檢測,宏沒只是簡單的替換,要註意優先級
怎樣定義一個靜態數據成員,如何使用這個成員。
使用static在類中聲明,在類外初始化。
public: 類名::變量 對象.變量
怎樣定義一個靜態成員函數,使用這個函數需要註意什麽。
在成員函數前加上static。 只能訪問類內的靜態成員
在C++中結構體和類有什麽區別,舉例說明。
C++中除了默認訪問權限,其它都一樣
struct(public) class(private)
++i(--i)和i++(i--)有什麽區別,舉例說明.
++i: 先++再使用 i++先使用再++
運算優先級最低的元算符是什麽,最高的是什麽,obj->num++的執行順序是什麽
, . -> ++
怎樣獲取和設置一個函數執行後的錯誤碼,一般在什麽時候獲取它。
獲取: GetLastError(), 監視窗口輸入err,hr,在函數執行完畢之後
SetLastError()
什麽是內核對象,他有哪些特性,例舉你知道的內核對象。
內核對象是操作系統維護的一組數據結構,它是跨進程的,它擁有一個引用計數,
當打開一個內核對象的時候,引用計數+1,關閉時-1,當計數為0就銷毀。
進程、線程、互斥體、郵槽、IOCP、事件、信號量、線程池
什麽是內核句柄,怎樣獲取或關閉一個內核句柄。
句柄是一個整型索引,用於在句柄表中查找對應的內核對象
CreateProcess\CreateFile\CloseHandle()......
列出幾個常用到的線程操作函數
CreateThread()/_beingthreadex()/TerminateThread()/_endthreadex/SuspendThread()/ResumeThread()
列出幾個常用到的進程操作函數
CreateProcess()/ WinExec()/ system()/ TerminateProcess()/SuspendProcess()/ResumeProcess()
說明臨界區和互斥體有哪些區別
臨界區不是內核對象,臨界區有線程擁有者,臨界區崩了會死鎖
互斥體是內核對象,有線程擁有著,崩了不會死鎖
列出常用內核對象的創建函數
CreateThread()/CreateProcess()/CreateMutex()/CreateEvent()
說明動態鏈接庫和靜態鏈接庫的區別。
後綴名: .lib .dll
使用: lib需要包含頭文件,使用#pragma comment(lib, "")
dll LoadLibrary() + GetProcAddress()
程序: 動態鏈接庫不會增加程序的大小,但是不方便程序的移植
靜態鏈接庫會增加程序的大小,但是可以跨平臺
舉例說明常用的導出函數的方法。
使用.def模塊定義文件導出 // 默認就沒有名稱粉碎
使用_declspec(dllexprot) // extern "C" 用於防止名稱粉碎機制
說明信號量是什麽,如何使用信號量。
信號量可以被多次加鎖,沒有指定最大信號量
加鎖-1: WaitForXXXObject()
解鎖+1: ReleaseSemaphore()
舉例說明你說知道的進程間通信的方式。
郵槽、套接字、WM_COPYDATA、管道
IOCP是什麽,怎樣創建和綁定設備道完成端口。
IOCP全稱IO完成端口,
創建: HANDLE h = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 線程數)
綁定: CreateIoCompletionPort(h, 設備句柄, 0, 0)
使用udp通信,服務器和客戶端的基本步驟是什麽。
服務器: WSAStartup() -> socket() -> bind() -> sendto()/recvfrom() -> closesocket() ->WSACleanup()
客戶端: WSAStartup() -> socket() -> bind() -> sendto()/recvfrom() -> closesocket() ->WSACleanup()
使用tcp通信,服務器和客戶端的基本步驟是什麽。
服務器: WSAStartup() -> socket() -> bind() -> listen() -> accept() -> send()/recv() -> closesocket() ->WSACleanup()
客戶端: WSAStartup() -> socket() -> connect() -> send()/recv() -> closesocket() ->WSACleanup()
inet_addr("") htonl()
異步IO是什麽,怎樣使用異步IO讀寫設備?
同一時刻做多件事情,FILE_FLAG_OVERLAPPED
WaitForSingleObject的作用是什麽,它的復數形式怎樣使用。
等待一個內核對象,當它為有信號時(激發態)就返回,否則等待道設置的超時時間
WaitForMultipleObjects(要等待的個數,數組,是否等待所有,超時)
WaitForSingleObject和WaitForMultipleObjects副作用: 等待信號量會把當前信號-1
已學過的網絡通信模型有哪幾種?
IOCP、消息選擇、事件選擇(64)
python的基本類型有幾種,分別是什麽
int、float、復數
分別說明怎樣定義字典、列表和元組,並說明它們的特點
dict = { }; dict = dict() 保存鍵值對,可以修改 *
list = [ ]; list = list() 保存一組相連的數據,可修改
tuple = (1,); tuple = tuple() 不可修改
字符串切片指的是什麽,詳細說明它的用法。
a = "1234567"
a[:] = "1234567"
a[:-1] = "123456"
a[::-1] = "7654321"
a[::2] = "1357"
例舉常用的python列表操作函數。
list l
l.append
l.insert
l.pop(index)
什麽是對稱密碼,什麽是非對稱密碼,分別例舉。
對稱密碼使用的密鑰相同 AES DES 3DES
非對稱密碼使用的密鑰不同 RSA RC4
什麽是凱撒密碼,什麽是維吉尼亞密碼,什麽是base64編碼。
凱撒密碼:一種簡單的替換密碼
維吉尼亞密碼: 一種稍微復雜的替換密碼
base64: 使用指定的64個字符替換需要編碼的字符串
RSA加密算法的本質是使用了哪一個數學難題?
求大質數
怎樣創建、查看、使用和刪除數據庫?
create database XXX;
show databases;
drop database XXX;
use XXX;
怎樣創建、查看、重命名和刪除一張表。
create table XXX(列名 類型 約束, ...);
show tables;
desc table XXX;
rename table x to xx;
drop table XXX;
怎樣添加、刪除和修改表的指定字段
alter table XXX add 列名 類型 約束;
alter table XXX change old new;
alter table XXX modify XXX 類型;
alter table XXX drop XXX 類型;
怎樣添加、刪除和修改數據。
insert into XXX(x1,x2) values(v1,v2);
delete from XXX
update XXX set x1 = v1, x2 = v2;
表的約束有哪些,分別說明怎樣使用這些約束
主鍵: primary key;
非空: not null;
唯一: unique;
默認: DEFAULT
外鍵: ALTER table XXX add constraint foreign key(外間名) references XXX(xx)
怎樣獲取表"CharInfo"中的所有數據? 怎樣獲取表"NetChat"中列"user"的所有數據?
select * from CharInfo;
select user from NetChat;
怎樣獲取表"ChatFriend"中列"name"為"1"開頭或"1"結尾的數據?
select * from ChatFriend where name like "%1" or name like "1%"
怎樣獲取表"ChatFriend"中列"name"為"1"或列"friend"為"1"的數據?
select * from ChatFriend where name = 1 or friend = 1;
三大窗口風格是什麽,分別對應哪幾個宏。
子窗口(WS_CHILD) 彈出窗口(WS_POPUP) 重疊窗口(WS_OVERLAPPED)
UpdateData()的作用是什麽,他又哪幾種用法,分別是什麽。
UpdateData() 用於控件和對象的數據交換
UpdateData(true) 從控件上獲取數據
UpdateData(false) 設置數據道控件上
MFC和SDK的關系是什麽,它的基類名稱為什麽。
MFC是SDK的C++封裝, CObject
對話框分為哪兩種,在SDK和MFC中分別怎樣創建?
模態對話框:
SDK: DialogBox() MFC:doModal()
非模態對話框:
SDK: CreateDialog() MFC:create()
想要改變當前窗口的顯示方式可以使用哪個函數,怎樣使用這個函數?
ShowWindow(): SW_SHOW\SW_HIDE\SW_MINIMIZ\SW_MAXIMIZE
使用SDK顯示一個窗口,基本框架是什麽?
創建窗口類->註冊窗口類->創建窗口->顯示窗口->更新窗口->消息循環
WNDCLASS->RegisterClass()->CreateWindow()->ShowWindow()->UpdateWindow()
->(GetMessage()->TranslateMessage()->DispathMessage())
什麽是隊列消息?什麽是非隊列消息,怎樣產生這兩個消息?
隊列消息: 在消息循環中處理的的消息 PostMessage() 不阻塞
非隊列消息: 直接在回掉函數中處理的消息 SendMessage() 阻塞
修改窗口的回調函數有幾種方式,最好使用哪種?
SetWindowLong()\SetClassLong() 推薦使用SetWindowLong()
MFC實現消息映射的原理是什麽?依賴於哪兩個宏?
使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 維護了一個數組,保存了所有需要相應的消息和對應的函數
在編寫MFC程序時,用戶代碼的入口是哪個函數?
CMyApp.InitInstance() 虛函數
消息分為幾種,分別是什麽,用於哪些環境下?
窗口消息 WM_...... 直接被窗口響應
控制消息 WM_COMMAND 由簡單控件轉發給窗口
通知消息 WM_NOTIFY 由通用控件轉發給窗口
二叉樹的前中後序變量
根左右 左根右 左右根
逆序輸出鏈表中的數據
void show(Node* node)
{
if (node != null)
{
show(node->next);
printf("%d", node.i);
}
}
鏈表:空間可以是不連續的,不支持隨機存取,鏈表的插入和刪除時間復雜度為O(1)
順序表:空間是連續的,隨機存取的時間復雜度為O(1)
c 復習