c++编程思想(一)-------存取控制是编译器行为

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++的这种存取控制是在编译阶段由编译器保证的,到了链接阶段已经没有这些存取信息了。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self-motivation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值