例如,
Class Test {
private:
int x;
public:
int y;
}obj;
现在,可以访问obj.y但不能访问obj.x
我的问题是编译器如何限制对私有数据的访问?
此外,如何在C结构中实现访问说明符?
答案 0 :(得分:9)
编译器拥有关于翻译单元中所有代码的所有信息(源文件和所有包含的头文件),因此可以跟踪哪些成员是私有的,哪些成员不是。 编译器如何它不相关,不同的编译器可以不同的方式实现它。
私有/公共成员是纯编译时的概念,编译的可执行代码中没有任何内容强制执行它。
答案 1 :(得分:1)
我的问题是编译器如何限制对私有数据的访问?
当源代码引用任何变量时,C ++编译器必须进行名称查找才能找到变量(它可以是局部变量,成员变量,全局变量等),并且必须进行访问检查。编译器具有关于类型,变量和范围的所有信息,因此当源代码引用变量时,编译器知道变量是否可访问。如果变量不可访问,编译器将拒绝源代码。
询问“如何”并没有真正有一个合理的答案 - 它是编译器,它就是它的作用。如果你正在尝试编写C代码来做同样的事情,知道它是如何做的对你没有帮助,因为你在程序的源代码中可以做的事情与编译器完全不同。这就像询问飞机如何飞行,然后询问如何乘坐飞机。知道一个人的答案与另一个人无关。
此外,如何在C结构中实现访问说明符?
两个选项:
C不支持,使用C ++
在结构中存储void*
,指向某种不透明类型,并且只有“私有”函数(即API的内部)知道该不透明类型的详细信息。
这是一个简单的例子
//
// in header only "public" data is visible
//
struct Data {
int some_number;
void* private_data;
};
Data* create_Data(int i, int j);
void manipulate_Data(Data*);
//
// in source file, these functions know what the `void*` points to and can use it
//
struct InternalData {
int another_number;
};
InternalData* get_internals(Data* d)
{
return (InternalData*)d->private_data;
}
Data* create_Data(int i, int j)
{
Data* data = (Data*)malloc(sizeof(Data));
data->some_number = i;
InternalData* internal = (InternalData*)malloc(sizeof(InternalData));
internal->another_number = j;
data->private_data = internal;
}
void manipulate_Data(Data* d)
{
data->some_number += get_internals(d)->another_number;
}