第一: private,public,protected的访问范围:
private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问.
protected: 可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问
public: 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问
注:友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数
友元分为两种:
友元函数和友元类(友元类的声明为了使得里面的成员函数变成友元函数,以访问把它当作友元类的类中的私有成员)
一、为什么要用友元和其缺点?
采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。有时候,其他类或者函数要访问该类的非公有成员,可以令其他类或者函数成为它的友元(friend)来实现。这样做提高了程序的运行效率,但同时也坏了类的封装性和隐藏性,使得非成员函数或其他类可以访问类的私有成员。
二、友元函数
友元定义格式如下:
friend 类型 函数名(形参);
首先,友元函数可以访问类的私有成员,其本身是定义在类外的普通函数,但是友元声明只能出现在类定义的内部,同时因为,友元不是类的成员也不受它所在区域访问控制级别的约束,其出现的位置不定,即既可以出现在private下也可以在public下;其次,若类想把一个函数作为它的友元,只需增加一条以friend关键字开头的函数声明语句即可。如:
1 class Sales_data 2 { 3 friend Sales_data add(const Sales_data&,const Sales_data&); //定义友元函数 4 ...... 5 }; 6 7 /*非成员函数的声明*/ 8 Sales_data add(const Sales_data&,const Sales_data&);
这里值得注意的几点是:
(1)友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明,如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明之外再专门针对函数进行一次声明。为了使友元对类的用户可见,我们通常把友元的声明与类的本身放置在同一个头文件中(类的外部)。
(2)友元函数的调用与一般函数的调用方式和原理一致。
(3)类和非成员函数的声明不是必须在它们的友元声明之前。
(4)友元函数能定义在类的内部,这样的函数是隐式内联的。
三、友元类
1、类之间的友元关系
如果希望一个类可以访问另一个类的非公有成员在内的所有成员(主要是非公有的成员),可以将一个类指定为另一类的友元类。
如将类B定义为类A的友元类:
1 class A 2 { 3 .......//省略其他 4 private: 5 friend class B; 6 };
这里使用友元类有几点要注意的:
(1)友元关系不存在传递性,即每个类负责控制自己的友元类或者友元函数;
(2)友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3)友元关系不能被继承。
2、成员函数作为友元
即一个类的成员函数作为另一个类的友元。此时,我们必须指出该成员函数属于哪个类。
1 class A 2 { 3 .......//省略其他 4 private: 5 friend void B::add(a,b); 6 }
这里指明函数add是类B的成员函数。
这里有一点要注意的是 B::add必须在A类之前被声明;
第二:类的继承后方法属性变化:
使用private继承,父类的所有方法在子类中变为private;
使用protected继承,父类的protected和public方法在子类中变为protected,private方法不变;
使用public继承,父类中的方法属性不发生改变;