本文首发于个人博客
友元
- 友元包括友元函数和友元类
- 如果将函数A(非成员函数)声明为类C的友元函数,那么函数A就能直接访问类C对象的所有成员
- 如果将类A声明为类C的友元类,那么类A的所有成员函数都能直接访问类C对象的所有成员
- 友元破坏了面向对象的封装性,但在某些频繁访问成员变量的地方可以提高性能
友元函数
如下代码:类Point。x和y坐标,成员变量是私有的,获取值通过get函数获取
1 | class Point { |
定义2个point,然后我们想把这两个point相加。就如下所示
1 | int main(){ |
- 能达到要求,但是问题是,调用add函数时候,每次获取x和y的值,都要通过
getX()
或者getY()
来取值。因为m_x
是私有成员,使用p1. m_x
是会报错的。 - 有什么办法能直接
p1. m_x
就可以访问么。同时m_x
依然是私有成员
那就通过友元函数来实现
上的代码改成
1 |
|
也就是说把friend Point add(Point, Point)
放在class Point
中,这样说明这个函数是朋友了嘛,既然是朋友了,那可以直接访问私有成员变量。当然了其他函数想直接访问私有成员变量依然是不可以的。
友元类
既然和函数可以做朋友,那和类呢?答案是可以的。如下
1 | class Point { |
class Point
中声明了友元类friend class Math;
那么在类Math
中也是可以直接访问类Point
中的私有成员变量。