数据结构:
本周从代码角度理解树,与树的应用
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