问题的提出:
我们已知道类具备封装和信息隐 藏的特性。只有类的成员函数才能访问类的私有成员,程式中的其他函数是无法访问私有成员的。非成员函数能够访问类中的公有成员,但是假如将数据成员都定义 为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开 销,而影响程式的运行效率。
友元是一种定义在类外部的普通函数,但他需要在类体内进行说 明,为了和该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是他能够访问类中的私有成员。友元的作用在于提高程式的运 行效率,但是,他破坏了类的封装性和隐藏性,使得非成员函数能够访问类的私有成员。
C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。
友元函数:
既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;
友元成员函数:
既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;
友元类:
友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;
示例:
1 using namespace std; 2 3 class B; 4 5 class A{ 6 private: 7 int x; 8 public: 9 A(); 10 void display(B &); 11 }; 12 13 class C; 14 15 class B{ 16 private: 17 int y; 18 int z; 19 public: 20 B(); 21 B(int, int); 22 friend void A::display(B &);//友元成员函数 23 friend void display(B &);//友元函数 24 friend class C;//友元类 25 }; 26 27 class C{ 28 private: 29 int sum; 30 void calc(B &); 31 public: 32 C(); 33 void display(B &); 34 }; 35 36 //必须在友元关系的类后进行定义 37 void display(B &v)//友元函数 38 { 39 cout << v.y << " " << v.z << endl; 40 } 41 42 A::A() 43 { 44 this->x = 0; 45 } 46 47 void A::display(B &v)//友元成员函数 48 { 49 this->x = v.y + v.z; 50 cout << this->x << endl; 51 } 52 53 B::B() 54 { 55 this->y = 0; 56 this->z = 0; 57 } 58 59 B::B(int y, int z) 60 { 61 this->y = y; 62 this->z = z; 63 } 64 65 C::C() 66 { 67 sum = 0; 68 } 69 70 void C::display(B &v) 71 { 72 this->calc(v); 73 cout << sum << " = " << v.y << " + " << v.z << endl; 74 } 75 76 void C::calc(B &v) 77 { 78 sum = v.y + v.z; 79 } 80 81 int main() 82 { 83 A a; 84 B b(2, 3); 85 display(b); 86 a.display(b); 87 C c; 88 c.display(b); 89 90 return 0; 91 }
时间: 2024-10-11 17:49:20