目录
- 1.友元
- 2. 友元函数
- 3. 友元类
1.友元
- 作用:用于访问类中的所有数据成员
- 缺点:破坏类的封装性,所以不到万得已,不要随便用友元
2. 友元函数
- 语法:
friend 函数的返回值类型 函数名(参数列表)例子: friend void show() //该函数就可以访问声明他的类中的所有成员 {}
- 当一个函数被声明为该类的友元函数时,该函数就不属于类中的成员函数!!
- 友元函数必须要在类内,声明!
- 友元函数可以在类中的任意地方声明, 与成员权限无关。
- 例子:
(结果如下)class base{public: int a;protected: int b; private: int c;//声明 show 函数是该类的一个友元函数 friend void show(); //属于base 中的成员函数吗??不属于 };//base 类的一个友元函数 void show(){base a; a.a = 100; //只能访问共有成员 a.b = 200; a.c = 300;cout << a.a << endl; cout << a.b << endl; cout << a.c << endl; }
- 友元函数可以继承吗?
友元函数是不可以继承的。class base {private: int a;//声明一个 set 友元函数friend void set(); };class new_base:public base {private:int b;//声明一个 set 友元函数friend void set(); };void set() {base a; a.a = 1000; //可以访问私有 成员cout << a.a << endl;new_base b;b.b = 2000; //不可以访问 new_base 的私有成员。 编译出错 }
假设需要友元函数可以访问子类的私有成员,则需要在子类中再次声明该函数为友元函数。
多个类可以对应一个友元函数吗?? 可以的!!
一个类可以对应多个友元函数吗?? 可以的!!
3. 友元类
- 作用:
当一个类为 另外一个类的友类,则该类可以访问对方的一切数据成员。 - 语法:
friend class 类名
- 例子
class test{ public: //单纯声明一个接口void set_base(); private: int c; //声明 base 是 test 的友元 friend class base; };class base{ public: //访问 test 中的私有成员 void set_test(){test a; a.c = 100; } private: int c; //声明test 是base 的友元 friend class test; };//重点!!重点!!在base 定义后 才实现 set_base 接口 void test::set_base() {base a; a.c = 200; }