1.0 C++远征:友元
友元
一、友元
无视private、protected限定符。
破坏了类的封装性。
如无需要,不推荐使用。
1.友元函数
朋友关系,体现在函数上就是友元函数。
关键字:在函数声明前加关键字friend
(1)友元全局函数
// Coordinate.cpp
class Coordinate {
// 友元全局函数
// 全局函数
friend void printXY(Coordinate &c);
public:
Coordinate(int x, int y);
private:
int m_iX;
int m_iY;
};
// mainl.cpp
void printXY(Coordinate &c) {
// 具体实现
}
(2)友元成员函数
// Circle.cpp
class Coordinate; // 前向声明,声明有这么一个类,告诉编译器先使用
class Circle {
public:
void printXY(Coordinate &c) {
cout << c.m_iX << " " << c.m_iY << endl;
}
};
// Coordinate.cpp
class Coordinate {
// 友元成员函数
// 将类的成员函数声明为另一个类的友元成员函数
// Coordinate授权给Circle::printXY(),使Circle的成员函数printXY()可以访问Coordinate的所有成员变量
friend void Circle::printXY(Coordinate &c);
public:
Coordinate(int x, int y);
private:
int m_iX;
int m_iY;
};
// main.cpp
int main() {
Coordinate coor(3, 5);
Circle circle;
// Coordinate使用Circle的成员函数
circle.printXY(coor);
return 0;
}
2.友元类
朋友关系,体现在类上就是友元类。
关键字:在类名前加关键字friend
// Time.h
#pragma once
//#include "Match.h" // 此处不应包含友元类的头文件
class Match; // 前向声明
class Time
{
public:
Time(int hour, int min, int sec);
~Time();
friend Match; // 友元类
private:
void timesPrintTime();
int m_iHour;
int m_iMinute;
int m_iSecond;
};
// Match.h
#pragma once
#include "Time.h" // 在Match中使用Time
class Match
{
public:
Match(int hour, int min, int sec);
~Match();
void testTime();
private:
Time m_tTimer; // 在Match中使用Time
};
// main.cpp
int main() {
Match mt(10, 21, 33);
mt.testTime();
return 0;
}
3.友元的注意事项
(1)友元关系不可传递
(2)友元关系的单向性
(3)友元声明的形式及数量不受限制
- 友元只是封装的补充
- 如果设计合理,不须用到友元
- 定向暴露了数据