數據結構:
本週從代碼角度理解樹,與樹的應用
C++:
不允許在類聲明中初始化靜態成員變量,因爲聲明描述瞭如何分配內存,但並不分配內存;可在類外語句進行初始化,如ClassA::Num_string = 0;初始化是在方法文件中,而不是在頭文件中,因爲可能有多個文件包含而出現多個初始化副本語句;靜態成員如果要在類聲明中初始化,則必須爲整形或枚舉型const??
一個類,如果沒有定義,則會默認創建1.默認構造函數2.複製構造函數3.默認析構函數4.賦值操作符”=”5.地址操作符
帶參數的構造函數也可以是默認的構造函數,只要所有參數都有默認值;只能有一個默認構造函數,就是說不能這樣:klunk(){klunk_ct = 0;} klunk(int n = 0){klunk_ct = n;}不能同時出現;
按值傳遞意味着創建原始變量的一個副本,編譯器生成臨時對象時,也將使用複製構造函數;默認的複製構造函數逐個複製非靜態成員(淺複製),複製的是成員的值;
如果類中包含了使用new初始化的指針成員,則應當定義一個複製構造函數,以複製指向的數據,而不是指針,稱爲深複製;
對於const數據成員,必須在執行到構造函數體之前,即創建對象時進行初始化---成員初始化器列表;必須用來初始化非靜態const成員和引用數據成員;
私有繼承,保護繼承,多重繼承;虛擬基類.類模板.
API:
進程間通信
進程間通信包括: 文件映射,共享內存,匿名管道,命名管道,郵槽,剪貼板,動態數據交換,對象連接與嵌入,動態連接庫,遠程過程調用,NetBios函數,Sockets,WM_COPYDATA等…
其中比較常用的有:
1.共享文件方式
file.Open(filename , CFile::modeCreate | CFile::modeWrite | CFile::shareDenyRead)
file.Open(filename , CFile::modeRead|CFile::shareDenyWrite)
2.共享內存方式
(1)數據發送
尋找接收數據的程序Recieve的窗口指針pWnd和進程句柄hProcess,用VirtualAllocEx()函數在這個進程中申請虛擬內存空間。然後通過WriteProcessMemory()把字符串m_strsend存放入虛擬內存中,並且通過消息wm_nMemMsg把所申請的內存空間起始地址發送給數據接收程序。最後,當數據接收程序接收到數據後,用VirtualFreeEx()釋放所申請的虛擬內存。
const UINT wm_nMemMsg=RegisterWindowMessage("mem_data");
CWnd *pWnd=CWnd::FindWindow(NULL,_T("Recieve")); //查找Recieve進程
GetWindowThreadProcessId(pWnd->m_hWnd, (DWORD*)&PID );
HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS,FALSE,PID);
lpBaseAddress = VirtualAllocEx(hProcess, 0, BUFFER_SIZE, MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(hProcess, lpBaseAddress, data, BUFFER_SIZE, NULL);
pWnd->SendMessage(wm_nMemMsg,NULL,(LPARAM)lpBaseAddress); //發送基址給Recieve進程
VirtualFreeEx(hProcess,lpBaseAddress, 0, MEM_RELEASE); //釋放虛擬內存
(2)數據接收
const UINT wm_nMemMsg=RegisterWindowMessage("mem_data");
HANDLE hProcess=GetCurrentProcess();
ReadProcessMemory(hProcess, lpBaseAddress, data,BUFFER_SIZE, NULL);
3.映射文件方式
內存映射文件是通過兩個或多個進程映射同一個文件映射對象的視圖來實現的,這意味着它們將共享物理存儲器的同一個頁面。因而,當一個進程將數據寫入一個共享文件映射對象的視圖時,其他進程能夠立即看到它們視圖中的數據變更情況。如果多個進程共享單個文件映射對象,那麼所有進程必須使用相同的名字來表示該文件映射對象。
(1)數據發送
CreateFileMapping()//函數創建一個命名的內存映射對象,得到相應內存起始位置指針/如果MapViewOfFile()//映射到本進程的地址空間
UnmapViewOfFile()//取消本進程地址空間的映射
(2)數據接收
OpenFileMapping()//打開一個命名的內存映射文件對象,得到相應內存起始位置指針MapViewOfFile()映射對象的一個視圖,得到指向映射到內存的第一個字節的指針並通過該指針讀寫共享的內存區域。
UnmapViewOfFile()//解除視圖映射,關閉內存映射文件,
4.管道方式
匿名管道和命名管道。匿名管道是不命名的,它最後用於本地系統中父進程與它啓動的子進程之間的通信。命名管道則高級一些,通過一個名字進行標識,使客戶端和服務端應用程序能夠通過該管道進行通信。Win32命名管道以至能夠在不同系統的進程間使用.
(1)創建命名管道
CreateNamedPipe()
ConnectNamedPipe()
(2)讀取數據ReadFile
(3)寫入數據WriteFile()
(4)連接命名管道.
客戶端在連接服務器端程序創建的命名管道之前,首先應判斷一下,能否有能夠利用的命名管道,這能夠通過調用WaitNamedPipe()函數實現,該函數會不斷等待,直到指定的超時間隔已過,或者指定了命名管道的實例能夠用來連接了,也就是說該管道的服務器進程有了一個未決的ConnectNamedPipe操做。如果當前命名管道的實例能夠使用,那麼客戶端就能夠調用CreateFile函數打開這個命名管道,與服務端進程進行通信了
WaitNamedPipe()
CreateFile()
(5)讀取數據 ReadFile()
(6)寫入數據WriteFile()
5.剪貼板方式
剪貼板是一種比較簡單同時也是開銷比較小的IPC(進程間通信)機制。Windows系統支持剪貼板IPC的基本機制是由系統預留的一塊全局共享內存,用來暫存各個進程間進行交換的數據。提供數據的進程創建一個全局內存塊中,並將要傳送的數據移到或複製到該內存塊;而接受數據的進程(也能夠是提供數據的進程本身)獲取此內存塊的句柄,並完成對該內存塊數據的讀取。
(1)數據發送
OpenClipboard()
EmptyClipboard();
SetClipboardData();
CloseClipboard();
(2)數據接收
OpenClipboard()
IsClipboardFormatAvailable()
GetClipboardData()
CloseClipboard()
6.消息方式
消息是Windows操做系統提供的一種驅動機制。利用消息進行進程通信,就是使用消息激活某種操做的過程。對於進程間的通信,一般採用用戶自定義的消息來完成;如果要實現的是Windows定義的消息功能,則能夠使用已定義的消息。
(1)數據發送
FindWindow()
COPYDATASTRUCT cpd; //給COPYDATASTRUCT結構賦值
cpd.dwData = 0;
cpd.cbData = m_strsend.GetLength();
cpd.lpData = (void*)m_strsend.GetBuffer(cpd.cbData);
SendMessage();
(2)數據接收
設計模式:創建型,已總結,見http://blog.csdn.net/asmemgsd/archive/2010/09/16/5888519.aspx