友元
- 友元是C++提供的一种破坏数据封装和数据隐藏的机制;
- 通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息;
- 可以使用友元函数和友元类;
- 为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元;
1、友元函数
面向对象的三大特性:封装、继承和多态,封装使得成员变量和成员方法隐藏起来了,用户必须通过预留的接口来使用类,一定程度上提供了安全性。
在类定义中,使用访问说明符来指定成员权限:
- public:类内自由访问、类外通过对象访问;
- private:类内自由访问,类外通过对象使用共有接口访问;
- protect:类内自由访问,类外通过对象使用共有接口访问;
如上所述,使用对象和公有接口可以访问类中的所有成员,但是如果定义了非成员函数,怎么不通过公有接口访问类中的私有、保护成员呢?
此时,友元的作用就体现出来了:可以让该非成员函数成为该类的友元函数,之后该函数就可以访问类内部的数据和方法了;
操作:
class student
{
friend void print(const student&);
public:
student();
~student();
private:
QString name;
};
void print(const student& s)
{
qDebug() << "name: " << s.name;
}
注意:
- 友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限;
- 友元不是类的成员,不受它所在区域访问控制级别的约束;
- 友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明,如果希望类的用户能够调用某个友元函数,那么就必须在友元声明之外再专门对函数进行一次声明
2、友元类
- 若一个类为另一个类的友元,则该类的所有成员都能访问对方类的私有成员;
- 声明语法:将友元类名在另一个类中使用
friend修饰说明; - 类的友元关系是单向的,即类A是类B的友元,类B不是类A的友元;
class A
{
friend class B;
public:
A();
~A();
void display()
{
cout << x << endl;
}
private:
int x;
}
//=============================================
class B
{
public:
B();
~B();
void set(int i)
{
a.x = i;
}
void display()
{
a.display();
}
private:
A a;
}
本文探讨了C++中的友元概念,包括友元函数如何访问私有成员,友元类的双向关系,以及如何在保证数据安全性的前提下合理使用。重点介绍了友元的声明位置和权限控制,以及其对封装原则的影响。
248

被折叠的 条评论
为什么被折叠?



