版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
C++成员访问权限及友元介绍
对于C++类,可以定义三种不同访问控制权限的成员。这三种分别是public公有类型,private私有类型,protected保护类型。
- public 具有这个访问控制权限的成员是完全公开的,即该成员不但可以被它所在类的成员函数及该类的友元函数访问,而且可以被和该类对象处于同一作用域的任何函数访问。
- private 对类外完全保密,只能被它所在类中的成员函数和该类的友元函数访问
- protected 只能被它所在类及该类派生的子类成员函数及友元函数访问
友元介绍
类可以允许其他函数或者类访问它的非公有成员,方法是令其成为友元
- 友元的声明只能出现在类的内部,但是在类内出现的具体位置不限制友元函数不是类的成员,也不受所在区域访问控制级别的限制
- 友元函数的定义可以在类内也可以在类外
class Count
{
public:
Count():a(10){};
friend void fn1(Count obj); //声明友元函数
private:
int a;
};
//定义友元函数
void fn1(Count obj)
{
//cout << a << endl //这里是错误的!访问私有成员应该是对象访问!友元函数上面说过是普通函数
//所以这里需要传入一个对象参数,来访问Count类中的私有成员!
cout << obj.a << endl;//正确
}
int main(){
Count obj1;
fn1(obj1);
}
注意,友元函数访问一个类的私有成员和保护成员是通过对象来访问
友元关系注意:
- A是B的友元,不代表B是A的友元
- A是B的友元,B是C的友元,不代表A是C的友元
还可以令一个类作为本类的友元,也可以把另一个类的成员函数作为本类的友元
A中声明B为友元,表示B可以访问A 私有和保护成员
class Count
{
public:
friend class CTime; //声明CTime为Count的友元类
private:
int a;
};
class CTime
{
public:
void fn1(){
for (int i = 0; i < 20;i++)
{
obj[i].a = i;
}
}
void fn2(){
for (int i = 0; i < 20;i++)
{
printf("%d\n", obj[i].a);
}
}
private:
Count obj[20]; //定义20个Count对象
};
int main(){
CTime cls;
cls.fn1();
cls.fn2();
}
一个类指定另一个类为友元类,相当于友元类的成员函数都成为了友元函数,可以访问此类的所有成员。
当把另一个类的成员函数作为本类友元时,必须注意彼此依赖关系,按顺序声明定义
class Student; //这里声明Student
//1.我们先定义Teacher类,其中声明clear函数
class Teacher
{
public:
Teacher(){}
int clear(Student obj);
//这里切记不能定义它,因为clear函数用到了Student类的对象
};
//2.接下来定义Student类,其中包括对clear的友元声明
class Student
{
public:
Student() :m_score(123){}
friend int Teacher::clear(Student obj);
private:
int m_score;
};
//3.定义clear,这时候才能使用Student成员
int Teacher::clear(Student obj){
return obj.m_score;
}
int _tmain(int argc, _TCHAR* argv[])
{
Student obj1;
Teacher obj2;
cout << obj2.clear(obj1) << endl;
return 0;
}
注意顺序,慢慢体会
————————————————————部分参考https://www.cnblogs.com/Tempt/p/9987505.html