友元
通常情况下,我们不能随意使用类内部的成员。但在某一些情况下,我们又需要去访问类成员。将函数或类定义成友元,就可以使用类的成员。不管是 public
、protected
还是private
,友元都可以使用。虽然友元的声明在类内部,但友元不属于类成员。
友元可以是某一个类、类成员函数、全局函数;友元是让其它不属于本类的成员(其它类、其它类成员函数、全局函数)成为类的成员而具备了本类成员的属性;
友元的格式:
friend void test1(A &a); //友元函数
friend class B; //友元类
friend void C::test3(A &a);//友元类成员函数
例:
#include <iostream>
#include <string>
class A;
class C{
public:
void test3(A &a)
{
}
};
class A{
friend void test1(A &a);
friend class B;
friend void C::test3(A &a);
public:
A() : s("hello C++"),val(0) {
}
~A(){
}
private:
int val;
std::string s;
};
class B{
public:
void test2(A &a)
{
a.val = 10;
std::cout << a.s << std::endl;
}
};
void test1(A &a)
{
std::cout << a.s << std::endl;
}
int main(int argc, char* argv[])
{
return 0;
}
使用友元的注意事项:
- 友元在一定程度上破坏了类的封装性;尽量少用友元;
- 友元不能被继承;
- 友元是单向的,类B是类A的友元,但A不能访问B的成员;
- 友元不具有传递性,类B是类A的友元,类C是类B的友元,但类C不一定是类A的友元,要在类A中声明;