句柄类 智能指针,句柄类这个很多人还不知道,现在让我们一起来看看吧!
1、VC 中的句柄 HANDLE 其实是一个 void * 类型。
【资料图】
2、像 C 语言中的 FILE 一样,它是个结构体,FILE * 其实是一个结构体地址类型。
3、句柄在 Windows 系统中类似于指针,它就是个指针类型,但是又和指针不同。
4、比如分配一块可移动的内存,你可以得到一个固定的句柄,但是这块内存的指针是不固定的。
5、句柄还有其他很多种,都是通过 HANDLE 定义而来的。
6、在 Windows 编程中,句柄代表系统中唯一一个对象,比如文件句柄、图标句柄、字体句柄、位图句柄、画刷句柄、设备环境句柄、应用程序模块句柄、进程句柄、窗口句柄等。
7、由于 Windows 是封闭的,微软提供很多现成的函数(Windows API),句柄就是访问这类对象的一个 "指针",通过句柄才能访问这些对象。
8、HANDLE 类型在 Windows SDK 头文件定义如下:typedef void *PVOID;typedef PVOID HANDLE; //文件句柄、进程句柄等typedef HANDLE HICON; //图标句柄typedef HANDLE HFONT; //字体句柄typedef HANDLE HBITMAP; //位图句柄typedef HANDLE HBRUSH; //画刷句柄typedef HANDLE HDC; //设备环境句柄typedef HANDLE HMODULE; //模块句柄typedef HANDLE HWND; //窗口句柄还有很多其他的句柄类型。
9、c++中没有所谓句柄类的概念在windows编程中倒是有一个句柄的概念,类型是HANDLE,这个其实不是一个类,HANDLE在windows其实只是一个类型定义,其内部的类型是数值类型(例如int),这个只是为了唯一标示一个对象/内核对象而已句柄类(智能指针smart point)是存储指向动态分配(堆)对象指针的类。
10、除了能够在适当的时间自动删除指向的对象外,工作机制很像C++的内置指针。
11、智能指针在面对异常的时候格外有用,因为能够确保正确的销毁动态分配的对象。
12、也可以用于跟踪被多用户共享的动态分配对象。
13、在C++中一个通用的技术是定义包装(cover)类或句柄(handle)类,也称智能指针。
14、句柄类存储和管理基类指针。
15、指针所指向对象的类型可以变化,它既可以指向基类类型对象又可以指向派生类型对象。
16、用户通过句柄类访问继承层次的操作。
17、因为句柄类使用指针执行操作,虚成员的行为将在运行时根据句柄实际绑定的对象类型而变化,即实现c++运行时动态绑定。
18、故句柄用户可以获得动态行为但无需操心指针的管理。
19、《c++ 编程思想》第1卷:标准c++导引——第五章:句柄类(handle class),或称为“cheshire cat”。
20、作用主要是用来隐藏接口的实现部分,和减少项目的重新编译。
21、例子:class handle_{struct cheshire_;cheshire_* smile;public:void initialize();......}在实现部分.cpp 中struct handle_::cheshire_{int i;}void handle_::initialize(){smile=new cheshire_;smile->i=0;}......和JAVA里的代理概念是一致的,C++使用类的时候必须在头文件中把类声明一遍,这样只要看头文件这个类的所有方法名和成员变量名就都曝光了,极大的损害了封装性质,因此就诞生了句柄了。
22、因为用户是无法查看实现文件的(但是可以查看声明文件)。
23、在头文件里只是声明一个外壳类,而在实现文件中把真正的类和实现写上,在用声明的外壳调用,举例如下:a.hclass a{//a是外壳类(JAVA中称为代理类,b才是真正要用的类) class b; b B; public : void name();};a.cpp//---------------句柄类的声明与实现-----------------------class b{ void nameb(); void c(); void d();};void a::b::nameb(){....}void a::b::c(){....}void a::b::d(){....}//-------------------------------------void a::name(){B.nameb();.....};如上,可以看出,真正发挥作用的是class b;但是如果检查头文件的话,我们无法知道class b到底有哪些方法有哪些性质,这样就完善了C++的封装性!。
本文到此分享完毕,希望对大家有所帮助。