目录
0.C++类中成员变量和成员函数的访问权限
<0>.C++ 类中可以有 public、protected、private 三种属性的成员。
<1>.外部类可以通过实例化对象,可以访问public成员。
<2>.只有本类中的函数可以访问本类的 private 成员。
<3>.例外情况:通过友元(friend)
1.友元函数
<1>.友元函数定义
<2>.程序例子
2.友元类
<1>.友元类定义
<2>.程序例子
可以使外部类访问当前类的public、protected、private全部属性的成员函数和成员变量.
在当前类以外定义的、不属于当前类的函数也可以在类中声明,但要在前面加 friend 关键字,这样就构成了友元函数。
友元函数可以是不属于任何类的成员函数,也可以是其他类的成员函数。
友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的。
#include
using namespace std;class Box{
public:Box(int wid): m_width(wid){cout << "wid = " << wid <%s(), m_width = %d\n",__FUNCTION__,box.m_width);
}int main( ){Box box(55);test_friend(box);return 0;
}
C++的friend关键字,不仅可以将一个函数声明为一个类的“朋友”,还可以将整个类声明为另一个类的“朋友”,这就是友元类。友元类中的所有成员函数都是另外一个类的友元函数。
如果将类B声明为类A的友元类,那么类 B 中的所有成员函数都是类 A 的友元函数,可以访问类 A 的所有成员,包括 public、protected、private 属性的。
#include
using namespace std;//提前声明Address类
class Address; class Student{
public:Student(char *name): m_name(name){printf("Student::m_name = %s\n", m_name);}void show(Address *addr);private:char *m_name;
};class Address{
public:Address(char *addr): m_addr(addr){//printf("Address::m_addr = %s\n", m_addr);}//将Student类声明为Address类的友元类,可以访问类Address的所有成员,包括public、protected、private属性的.friend class Student;
private:void test_private(){printf("xxx----->Address::%s(), line = %d\n",__FUNCTION__,__LINE__);}char *m_addr;protected:void test_protected(){printf("xxx----->Address::%s(), line = %d\n",__FUNCTION__,__LINE__);}
};void Student::show(Address *addr){cout<< "private::m_addr = " << addr->m_addr <test_private();addr->test_protected();
}int main(){Student *stu = new Student("ZhangSan");Address *addr = new Address("china");stu->show(addr);return 0;
}