C++ 句柄类

C++ 句柄类C 中的访问控制允许类的实现和类的接口分开 使得客户程序不能轻易访问私有实现部分 但是实现部分的隐藏不彻底 可能导致一些问题 1 头文件的成员声明可能暴露信息 可能会有恶意访问 恶意篡改 存在安全隐患 2 在设计初期 实现部分经常需要改动 就连头文件类的私有成员声明也时不时需要修改 这意味着程序员不论何时修改了一个类 都将重新编译包含了该头文件的所有文件 可能还要修改接口 增加不必要的编译

C++中的访问控制允许类的实现和类的接口分开,使得客户程序不能轻易访问私有实现部分,但是实现部分的隐藏不彻底,可能导致一些问题。

1)头文件的成员声明可能暴露信息,可能会有恶意访问,恶意篡改,存在安全隐患

2)在设计初期,实现部分经常需要改动,就连头文件类的私有成员声明也时不时需要修改。这意味着程序员不论何时修改了一个类,都将重新编译包含了该头文件的所有文件,可能还要修改接口,增加不必要的编译debug时间。

 

解决这种问题的常用技术称为句柄类,handle class,使得在类定义中只留下公共接口声明和一个指向结构体的私有指针成员,而结构体的定义和所有成员函数的定义一同放在实现文件中,这样一方面隐藏了内部信息防止外界通过指针或者强制类型转换来访问私有成员,也方便设计与修改。

我们举一个例子来看看:

#include "stdafx.h" #include 
  
    #include 
   
     #include 
    
      //vector可以像数组一样使用,还可以按照stl习惯使用 #include 
     
       //处理c风格字符串char*还需要cstring库 #include 
      
        //内有size_t函数 #include 
       
         using namespace std; //假设这下面class是头文件哈 class Handle { public: void initialize(); void cleanup(); int read(); void change(int); private: struct Inner; Inner* pointer; }; //.cpp内 struct Handle::Inner { int i; }; void Handle::initialize() { pointer = new Inner; //为保存数据成员的结构体分配空间 pointer->i = 0; } void Handle::cleanup() { delete pointer; } int Handle::read() { return pointer->i; } void Handle::change(int x) { pointer->i = x; } //handle类和一般的类的使用没啥区别 int main() { Handle h; h.initialize(); h.read(); h.change(10); h.cleanup(); } 
        
       
      
     
    
  

明天晚上我们来看看c++的构造函数吧!或者是开数据结构的预习章节——链表。

哎,人生艰难如此。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209796.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午8:23
下一篇 2026年3月19日 上午8:24


相关推荐

  • 使用 OpenGrok搭建大型源码阅读环境

    使用 OpenGrok搭建大型源码阅读环境

    2026年3月15日
    1
  • python写exploit

    python写exploit测试软件漏洞时 个人比较钟爱用 python 来完成 exploit 简单 快速 也见过不少用 perl 来写的 我不喜欢 随便记录一些常用的方法 python 中有个概念叫模块 模块中包含了定义的函数 方便重用 使用模块的语句如下 import 模块名 struct 模块有个很方便的函数 pack 格式如下 struct pack format 参数 将参数内容转换成 fo

    2026年3月18日
    2
  • 如何获取dropdownlist的值_mycat 数据库绑定

    如何获取dropdownlist的值_mycat 数据库绑定这几天遇到再DropDownList中,如何将数据库中的内容与DropDownList下拉框中的值关联起来,步骤如下:(1)建立要关联的数据库(在本例中假设为dept);要定义一个数据表用来取得这个表中的内容,代码如下:publicDataTableReaderSelectDept(){DataTableReaderdr=null;try{RunSQL

    2022年10月8日
    3
  • windows批处理删除文件

    windows批处理删除文件需要批量删除一些文件 如果用 dos 命令 可快速的批量删除 点击 开始 运行 输入 CMD 后回车 然后在 命令提示符 窗口下输入 delF desktop ini f s q a F 代表你要操作的盘符 如果是 C 盘就把 F 改成 C 强制删除 F 盘下所有目录内 包括 X 盘本身 的 desktop ini 文件并且不提示是否删除 f 表示强制删除文件 s 表示子目录都要

    2026年3月17日
    1
  • linux 下web服务的配置和架设

    linux 下web服务的配置和架设apache 的安装 配置和启动下载 www apache com 上传到 usr local tar zxvf 文件名 configurepre usr local apachemakema linux 下的解压过后的安装包如果有 configure 这个可执行文件 都这样安装 配置 vi etc httpd conf h

    2025年8月12日
    7
  • IDEA 2022.2.3激活码_通用破解码

    IDEA 2022.2.3激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    1.3K

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号