C++中的访问控制允许类的实现和类的接口分开,使得客户程序不能轻易访问私有实现部分,但是实现部分的隐藏不彻底,可能导致一些问题。
1)头文件的成员声明可能暴露信息,可能会有恶意访问,恶意篡改,存在安全隐患
2)在设计初期,实现部分经常需要改动,就连头文件类的私有成员声明也时不时需要修改。这意味着程序员不论何时修改了一个类,都将重新编译包含了该头文件的所有文件,可能还要修改接口,增加不必要的编译debug时间。
解决这种问题的常用技术称为句柄类,handle class,使得在类定义中只留下公共接口声明和一个指向结构体的私有指针成员,而结构体的定义和所有成员函数的定义一同放在实现文件中,这样一方面隐藏了内部信息防止外界通过指针或者强制类型转换来访问私有成员,也方便设计与修改。
我们举一个例子来看看:
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <vector> //vector可以像数组一样使用,还可以按照stl习惯使用
#include <string> //处理c风格字符串char*还需要cstring库
#include <cstddef> //内有size_t函数
#include <new>
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++的构造函数吧!或者是开数据结构的预习章节——链表。
哎,人生艰难如此。