友元
[TOC]
一铲觉、友元
無視private、protected限定符吓坚。
破壞了類的封裝性撵幽。
如無需要,不推薦使用礁击。
1.友元函數(shù)
? 朋友關(guān)系盐杂,體現(xiàn)在函數(shù)上就是友元函數(shù)。
? 關(guān)鍵字:在函數(shù)聲明前加關(guān)鍵字friend
(1)友元全局函數(shù)
// Coordinate.cpp
class Coordinate {
// 友元全局函數(shù)
// 全局函數(shù)
friend void printXY(Coordinate &c);
public:
Coordinate(int x, int y);
private:
int m_iX;
int m_iY;
};
// mainl.cpp
void printXY(Coordinate &c) {
// 具體實現(xiàn)
}
(2)友元成員函數(shù)
// Circle.cpp
class Coordinate; // 前向聲明哆窿,聲明有這么一個類链烈,告訴編譯器先使用
class Circle {
public:
void printXY(Coordinate &c) {
cout << c.m_iX << " " << c.m_iY << endl;
}
};
// Coordinate.cpp
class Coordinate {
// 友元成員函數(shù)
// 將類的成員函數(shù)聲明為另一個類的友元成員函數(shù)
// Coordinate授權(quán)給Circle::printXY(),使Circle的成員函數(shù)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的成員函數(shù)
circle.printXY(coor);
return 0;
}
2.友元類
? 朋友關(guān)系挚躯,體現(xiàn)在類上就是友元類强衡。
? 關(guān)鍵字:在類名前加關(guān)鍵字friend
// Time.h
#pragma once
//#include "Match.h" // 此處不應(yīng)包含友元類的頭文件
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)友元關(guān)系不可傳遞
(2)友元關(guān)系的單向性
(3)友元聲明的形式及數(shù)量不受限制
- 友元只是封裝的補(bǔ)充
- 如果設(shè)計合理,不須用到友元
- 定向暴露了數(shù)據(jù)