类是将数据成员和进行于其上的一系列操作(成员函数)封装在一起,注意:成员函数可以操作数据成员(可以称类中的数据成员为泛数据成员)!
对象是类的实例化,怎样理解实例化?其实每一个实例对象都只是对其中的数据成员初始化,内存映像中每个对象仅仅保留属于自己的那份数据成员副本。而成员函数对于整个类而言却是共享的,即一个类只保留一份成员函数。
那么每个对象怎样和这些可以认为是“分离”的成员函数发生联系,即成员函数如何操作对象的数据成员?记住this指针,无论对象通过(.)操作或者(->)操作调用成员函数,编译时刻,编译器都会将这种调用转换成我们常见的全局函数的形式,并且多出一个参数(一般这个参数放在第一个),然后将this指针传入这个参数。于是就完成了对象与成员函数的绑定(或联系).
实例化后就得到同一个类的多个不同的对象,既然成员函数共享的,那么成员函数就可以操作对象的数据成员。
问题是现在有多个对象,成员函数需要知道操作的是哪个对象的数据成员?
比如有对象obj1和obj2,都属于A类,A类有public成员函数foo()
如果obj1调用该函数,编译时会给foo函数传入this指针,obj1,foo中操作obj1自身的成员就不用任何修饰,直接访问,因为其中的数据成员自动根据this指针找到。
如果obj1调用该函数,同样可以访问同类的其他对象的数据成员!那么你需要做的是让foo函数知道是同类对象中哪个对象的数据成员,一个解决办法是传入同类其他对象的指针或引用,那么就可以操作同类其他对象的数据成员。
foo(A &obj)
这样定义,然后调用:obj1.foo(obj2)
就可以在obj1访问obj2的数据成员,而无论这些数据成员是private还是protected
C++ 类访问控制探讨 , In 技术维基 , Views : 0 , Comments: 0 , 04 March 2009
桥接,NAT网络配置详解 , In 技术维基 , Views : 44 , Comments: 0 , 04 March 2009
1、桥接:
什么是桥?简单的说桥是一个接口,是一个在功能层面和eth0一样的东西。不同之处在于桥是由多个接口共同构成的。从以太层看,把每一个接口收到的数据复制到其他接口。同样,向桥写入数据,桥内的所有接口都会收到。
现在要介绍一个设备,tap或着tun,简单的说这个东西是一块虚拟网卡。不同的是,tap是一个以太层的设备,而tun是Ip层的设备。(下面我们要使用的是tap。)具体来说tap/tun的工作原理是这样的:用户空间的程序向tap/tun写入数据,这些数据会传到内核的网络模块;内核网络模块也可以写入数据,而这些写入的数据又可以被用户空间的程序读到,正是因为这样,连上这块虚拟网卡的虚拟机就可以和宿主通信了!
现在我们开始:
1.1 安装一些工具
apt-get install uml-utilities //tunctl要用到,tunctl可以生成一个tap,我的理解是虚拟网卡
apt-get install bridge-utils //brctl要用到, brctl就是设置一个网桥了
1.2 创建一个Tap设备:
[root@sunshine ~]# tunctl -u root -t tap0
Set ‘tap0′ persistent and owned by uid 0
-u:指明这个设备归谁所有(为了避免权限问题引出的不必要的麻烦,本文中创建的所有设备都属于root);
-t:指明设备名,可以任意起,但是最好遵循linux上的命名规范;
(如果要删除创建的Tap设备,请使用tunctl -d [tapdevicename])
1