友元函数为类
class A{
private:
int a;
public:
A() { a = 55; }
friend class B;
};
class B{
private:
int b;
public:
void showA(A &x) {
cout << x.a << endl;
}
};
int main() {
A a1;
B b1;
b1.showA(a1);
return 0;
}
输出
55
友元函数为类的函数
class B;
class A
{
public:
void showB(B& );
};
class B
{
private:
int b;
public:
B() { b = 0; }
friend void A::showB(B& x); // Friend function
};
void A::showB(B &x)
{
// Since show() is friend of B, it can
// access private members of B
std::cout << "B::b = " << x.b;
}
int main()
{
A a;
B x;
a.showB(x);
return 0;
}
输出
B::b = 0
友元函数为全局函数
class A{
private:
int a;
public:
A(int x) { a = x; }
friend void showA(A &x);
};
void showA(A &x) {
cout << x.a << endl;
}
int main()
{
A a(44);
showA(a);
return 0;
}
输出
44
以下讨论继承与友元的关系:
- 友元函数在基函数中
class base{
protected:
int x;
public:
base(int a=0):x(a){}
friend void show();
};
class base2:public base{
protected:
int y;
public:
base2(int b):y(b){}
};
void show() {
base2 base_2(2);
cout << base_2.x << endl;
cout << base_2.y << endl;//出问题了
}
int main()
{
show();
return 0;
}
- 友元函数在继承函数中
class base{
private:
int x1;
protected:
int x;
public:
base(int a=0):x(a){}
};
class base2:public base{
private:
int y;
public:
base2(int b):y(b){}
friend void show();
};
void show() {
base2 base_2(2);
cout << base_2.x1 << endl;
cout << base_2.x << endl;
cout << base_2.y << endl;
}
总结:
友元函数在基函数里面a,一定可以访问基函数a的private的数据,但是不能访问继承函数B的protected的数据:
友元函数在继承函数B里面,能够访问B的private数据,同时能够访问基函数A的protected的数据,但是不能访问A的private的数据。