c++有三种存取访问控制权限,private,protected,public.三种权限的含义大家都应该知道。我在这里想说的是,<c++编程思想>里说这是一种编译器行为,编译结束后这些存取控制信息都会消失。也就是说,这些信息对链接器而言是透明的。所以我用下面的方式做了试验,证实了这个结论。
1.h
class A
{
private:
int a;
public:
A();
~A();
void set(int);
int get();
};
1.cpp
#include <iostream>
#include "1.h"
using namespace std;
A::A()
{
a = 0;
}
A:~A(){}
void A::set(int b){ a = b;}
int A::get(){ return a;}
将1.cpp编译成.o g++ -c 1.c -o 1.o,这样就只编译不链接,这样1.o里就应该没有存取控制信息了。
然后写一个测试程序:
main.c
#include <iostream>
#include "1.h"
using namespace std;
int main()
{
A obj(3);
obj.a = 4;
cout<<obj.a<<endl;
}
编译链接 g++ main.c 1.o //果然会编译报错,因为我们访问了私有成员。
然后,我们修改头文件1.h将a定义为public的,然后重新编译链接(注意,1.o没有重新编译,还是直接链接的老版本使用 )
g++ main.c 1.o //发现程序成功运行,我们可以直接访问。
这说明了什么呢?说明了c++里的存取控制确实是一种编译行为,而在链接阶段,这些存取信息已经不存在了。所以用老的1.h编译生成的1.o里没有存取控制信息,所以我们修改了1.h后,即使没有重新编译生成1.o,也是可以编译链接成功,并执行的。我们修改的1.h只是欺骗编译器而已。
C++的这种存取控制是在编译阶段由编译器保证的,到了链接阶段已经没有这些存取信息了。