1.0 C++远征:友元

友元

[TOC]

一、友元

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

  • 友元只是封装的补充
  • 如果设计合理,不须用到友元
  • 定向暴露了数据

你可能感兴趣的:(1.0 C++远征:友元)