目录
一、友元函数
1、定义
- (1)定义:友元函数是一个不属于类成员的函数,但它可以访问该类的私有成员。换句话说,友元函数被视为好像是该类的一个成员。
- 友元函数可以是常规的独立函数,也可以是其他类的成员。实际上,整个类都可以声明为另一个类的友元。
- 为了使一个函数或类成为另一个类的友元,必须由授予它访问权限的类来声明。类保留了它们的朋友的 "名单",只有名字出现在列表中的外部函数或类才被授予访问权限。通过将关键字 friend 放置在函数的原型之前,即可将函数声明为友元。
- 理解:让函数或者类作为另外一个类的朋友,则可以访问当前类的private或protected。
- (2)格式:
- friend 返回类型 函数名 (参数列表);
- 例:friend void Add(A& a);
2、特点
- (1)一个普通函数作为类的友元,那么在当前函数中就可以通过对象访问类的私有或者保护成员;
- 注意:这个函数只能在外部定义,在当前类中引用即可。
- (2)一个类的成员函数作为另外一个类的友元;
- 注意:成员函数建议放在类外定义。
- (3)一个类A作为另外一个类B的友元类,则A的所有成员函数就可以访问B的私有数据成员或保护成员;
- 注意:
- ①友元是单向的;
- ②友元是不能进行传递的;
- ③友元是不能继承的。
3、对友元函数定义理解:
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<<"+" <<b.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);
}
4、对“友元是不能传递的”理解
//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;
}
5、重载友元
cout——ostream类的对象
cin——istream类的对象cout<<a;
一般情况下:运算符可以解析成下面两种形式
1、cout.<<(a) ostream类中重载了<<,程序员不能修改
2、<<(cout,a) 可以在程序员自己定义的类中将<<重载友元
cout<<a<<b;
cout<<a这个表达式作为了上面表达式中的<<的左边——》返回值为引用
(cout<<(a)<<b表达式执行完后,还能继续用<<,说明返回值为ostream类型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;
}
//cout<<a<<b; <<(cout,a)<<(cout,b)
ostream& operator<<(ostream& out, A& a)
{
out << a.m_i;
return out;
}
如有错误,敬请指正。
您的收藏与点赞都是对我最大的鼓励和支持!