类是具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员。程序中其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员。但是数据成员都定义为公有的,又破坏了隐藏的特性。
在某些情况下,特别是对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查都需要时间开销。影响程序的运行效率。
提出了友元的概念:
友元是一种定义在类外部的普通函数,需要在类体内进行声明。
friend 函数返回类型 函数名();
友元函数不是成员函数,因此定义时无需“::”但可以通过对象作为参数直接访问对象的私有成员.
1)必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括在private和public部分;
2)注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号;
3)友元函数不能直接访问类的成员,只能访问对象成员,
4)友元函数可以访问对象的私有成员,但普通函数不行;
5)调用友元函数时,在实际参数中需要指出要访问的对象,
6)类与类之间的友元关系不能继承。
友元函数实例
class A {public: A() { a=0; b=1; } private: int a; int b; friend void print(A &hh) { cout<<hh.a<<endl; }
};
int main(){
A h;
print(h); return 0;}
友元:
友元关系不具对称性。即 A 是 B 的友元,但 B 不一定是 A 的友元。 友元关系不具传递性。即 B 是 A 的友元,C 是 B 的友元,但是 C 不一定是 A 的友元。
友元破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
以下给出友元类的定义:
例如,以下语句说明类B是类A的友元类:class A {public: A() { a=0; b=1; } friend class B;private: int a; int b;
};class B{public: void print(A &hh) { cout<<hh.a<<endl; }};
int main(){ A h; B b; b.print(h); return 0;} 经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。
