目录
- (1)定义:友元函数是一个不属于类成员的函数,但它可以访问该类的私有成员。换句话说,友元函数被视为好像是该类的一个成员。
- 友元函数可以是常规的独立函数,也可以是其他类的成员。实际上,整个类都可以声明为另一个类的友元。
- 为了使一个函数或类成为另一个类的友元,必须由授予它访问权限的类来声明。类保留了它们的朋友的 "名单",只有名字出现在列表中的外部函数或类才被授予访问权限。通过将关键字 friend 放置在函数的原型之前,即可将函数声明为友元。
- 理解:让函数或者类作为另外一个类的朋友,则可以访问当前类的private或protected。
- (2)格式:
- friend 返回类型 函数名 (参数列表);
- 例:friend void Add(A& a);
- (1)一个普通函数作为类的友元,那么在当前函数中就可以通过对象访问类的私有或者保护成员;
- 注意:这个函数只能在外部定义,在当前类中引用即可。
- (2)一个类的成员函数作为另外一个类的友元;
- 注意:成员函数建议放在类外定义。
- (3)一个类A作为另外一个类B的友元类,则A的所有成员函数就可以访问B的私有数据成员或保护成员;
- 注意:
- ①友元是单向的;
- ②友元是不能进行传递的;
- ③友元是不能继承的。
- class A {
- public:
- A(int i=0):m_i(i){}
- int GetI()const
- {
- return m_i;
- }
- protected:
- int m_j;
- friend void Add(A& a, A& b);//将Add函数作为类A的友元函数
- private:
- int m_i;
- };
-
- //想在当前Add函数中访问私有数据成员,又不想通过接口(公有函数)
- void Add(A& a, A& b)
- {
-
- cout << a.m_i << endl;
- cout << b.m_i << endl;
- cout << a.m_i<<"+" <
"="<< a.m_i + b.m_i << endl; - //cout << a.GetI() + b.GetI() << endl;
- }
-
- int main()
- {
- A a(5);
- A b(8);
- Add(a, b);
-
- }
//BB是AA的朋友,CC是BB的朋友,如果CC没有作为AA的友元类,则CC和AA没有关系——友元就不能传递
- //BB是AA的朋友,CC是BB的朋友,如果CC没有作为AA的友元类,则CC和AA没有关系——友元就不能传递
- class BB;
- class CC;
- class AA
- {
- public:
- friend class BB;
- private:
- int m_a;
- };
-
- class BB
- {
- public:
- friend class CC;
- void Show(AA& a);
- private:
- int m_b;
- };
-
- class CC
- {
- public:
- void print(BB& b);
- void test(AA& a);
- };
- void CC::test(AA& a)
- {
- cout << a.m_a << endl;//error,c不能访问a,类CC不是类AA的朋友
- }
- void BB::Show(AA& a)
- {
- cout << a.m_a << endl;
- }
- void CC::print(BB& b)
- {
- cout << b.m_b << endl;
- }
cout——ostream类的对象
cin——istream类的对象cout< 一般情况下:运算符可以解析成下面两种形式
1、cout.<<(a) ostream类中重载了<<,程序员不能修改
2、<<(cout,a) 可以在程序员自己定义的类中将<<重载友元
cout< cout< (cout<<(a)<friend ostream& operator<<(ostream &out,A &a)
- class A;//前项引用声明
- ostream& operator<<(ostream& out, A& a);
- class A
- {
- public:
- A(int i=0):m_i(i){}
- void print()
- {
- cout << m_i << endl;
- }
- A operator+(A& b)//this
- {
- return m_i + b.m_i;
- }
- friend A operator-(A& a, A& b);
- A operator++(int)//a++
- {
- int t = m_i;
- m_i = m_i + 1;
- return t;
- }
- friend A& operator++(A& a);
- friend ostream& operator<<(ostream& out, A& a);
-
- private:
- int m_i;
- };
- A& operator++(A& a)
- {
- ++a.m_i;
- return a;
- }
- A operator-(A& a,A&b)
- {
- return a.m_i + b.m_i;
- }
- ostream& operator<<(ostream& out, A& a)
- {
- out << a.m_i;
- return out;
- }
如有错误,敬请指正。
您的收藏与点赞都是对我最大的鼓励和支持!