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)友元声明的形式及数量不受限制

  • 友元只是封装的补充
  • 如果设计合理,不须用到友元
  • 定向暴露了数据
posted @ 2016-11-18 14:17  青_阳  阅读(219)  评论(2编辑  收藏  举报