友元函数:
-
作用:
一个类的友元函数可以访问该类的私有成员,也就是说:在一个类中声明一个友元函数,那么在那个友元函数中就可以访问这个类的私有成员。
-
声明方式:
在声明前加一个friend即可:
friend 类型名 函数名(参数表);
-
范围:
友元函数可以是普通函数,也可以是类中的成员函数,包括构造和析构函数,但必须是public的。
-
注意事项:
1)如果友元函数是另一个类的成员函数时必须要在另一个类前面加上对这个类的定义,否则成员函数在调用时不知道这个类在哪里。而且这个成员函数不能是一个内联函数,否则不能访问类中的私有成员。
2)如果一个类前面只有另一个类的定义,没有具体的结构,却要声明另一个类的成员函数是这个类的友元函数,这样是不可以的,若是真要这么做,可以将另一个类声明为这个类的友元类。
-
实例:
1 class CCar;//定义类CCar 2 class CDriver { 3 private: 4 int a; 5 public: 6 void ModifyCar(CCar *pCar);//友元函数 7 }; 8 class CCar { 9 private: 10 int price; 11 friend int MostExpensiveCar(CCar cars[], int total);//声明友元函数 12 friend void CDriver::ModifyCar(CCar *pCar);//声明友元函数 13 }; 14 void CDriver::ModifyCar(CCar *pCar) { 15 //该成员函数不能以内联函数的形式写在CDriver类中 16 pCar->price += 1000;//访问CCar类的私有成员 17 } 18 int MostExpensiveCar(CCar cars[], int total) 19 { 20 int tmpMax = -1; 21 for (int i = 0; i < total; i++) 22 if (cars[i].price > tmpMax) 23 tmpMax = cars[i].price;//访问CCar类的私有成员 24 return tmpMax; 25 }
1 class CCar;//定义另一个类,没有具体结构 2 class CDriver { 3 private: 4 int a; 5 friend CCar::CCar(CDriver *p);//声明友元函数(错误) 6 }; 7 class CCar { 8 private: 9 int price; 10 public: 11 CCar(CDriver *p); 12 }; 13 CCar::CCar(CDriver *p) { 14 p->a += 1;//不可访问 15 }
友元类:
-
作用:
A是B的友元类,A的成员函数可以访问B的私有成员。
-
声明方式:
friend class 类名;
-
注意事项:
友元类之间的关系不能传递,不能继承。
-
实例:
1 class CCar;//定义另一个类,没有具体结构 2 class CDriver { 3 private: 4 int a; 5 friend class CCar;//声明友元类(正确) 6 }; 7 class CCar { 8 private: 9 int price; 10 public: 11 CCar(CDriver *p); 12 }; 13 CCar::CCar(CDriver *p) { 14 p->a += 1;//访问CDriver类的私有成员 15 }