13友元函数好友元类
如果某个(些)外部函数需要直接访问类的数据成员,怎么办?
方法一:数据公有
方法二:友元
友元函数
1.友元函数是一般函数或其它类的成员函数
2.友元函数具有访问类的所有成员的权限
3.声明友元函数的方法:friend + 函数原型
4.除非能带来极大的便利,否则不要使用友元
示例:使用友元函数修改类的私有数据成员
//文件triangle.h
#if !defined __TRIANGLE__H__
#define __TRIANGLE__H__
class Triangle
{friend void setA(Triangle &t, int n);
public:
Triangle(int x = 5,
int y = 5, int z = 5);
void print();
private:
int a, b, c;
};
#endif
//文件triangle.cpp
#include "triangle.h"
#include <iostream.h>
Triangle::Triangle(int x, int y, int z)
{if (x+y>z && x+z>y && y+z>x)
{ a = x; b = y; c = z;}
else
{ a = b = c = 5; }
}
void Triangle::print( )
{cout<<"Triangle: "<<a<<", “
<< b <<", "<<c<<endl;
}
//文件ex12_5.cpp
#include "triangle.h"
void setA(Triangle &t, int n)
{t.a = n; //访问对象t的私有成员a
}
main()
{Triangle t;
t.print();
setA(t, 10);
t.print();
return 0;
}
友元类
1.一个类的友元类的所有成员函数都有访问类的所有成员的权限
2.友元类的声明方法:friend + class +类名
3.友元类的声明是单方面的
4.友元类的声明不是传递的
示例:
//文件class.h
#if !defined __CLASS__H__
#define __CLASS__H__
class B
{friend class A; //声明友元类
private:
int data;
};
class A
{public:
void setB(B &b, int m);
void print(B &b);
};
#endif
//文件class.cpp
//实现类A和B
#include "class.h"
#include <iostream.h>
void A::setB(B &b, int m)
{b.data = m; //访问B的私有成员
}
void A::print(B &b)
{
//访问B的私有成员
cout<<"The private data of class B: “
<<b.data<<endl;
}
#include "class.h"
main()
{A a;
B b;
//调用类A的成员函数修改类B的对象b的私有数据
a.setB(b, 10);
//调用类A的成员函数访问类B的对象b的私有数据
a.print(b);
return 0;
}