美文网首页C/C++学习笔记
1.0 C++远征:友元

1.0 C++远征:友元

作者: 青_阳 | 来源:发表于2016-11-18 18:36 被阅读6次

友元

[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++远征:友元

    友元 [TOC] 一、友元 无视private、protected限定符。破坏了类的封装性。如无需要,不推荐使用。...

  • 10-C++远征之模板篇-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

  • 慕课网-C++远征之模板篇(上)-学习笔记

    C++远征之模板篇 将会学到的内容: 模板函数 & 模板类 -> 标准模板类 友元函数 & 友元类 静态数据成员 ...

  • 1.0 C++远征:数据的封装

    4-1数据的封装 1.如何进行数据封装 ​ 未进行数据的封装,成员变量容易发生数据的泄露: ​ (1)可以...

  • 1.0 C++远征:为什么继承

    2-1为什么继承 1.Worker继承自Person,新增方法work()和成员m_iSalary: 2.继承方式...

  • c++ 友元

    在c++中,通过关键字friend声明为友元。友元可以范围与其有好友关系的类中私有成员。友元包括友元函数和友元类。...

  • C++语言基础(03)

    1.内存分配 C/C++ 内存分区: java 创建对象 2.常函数 3.友元函数和友元类 友元函数 友元类 4....

  • C++中的友元

    友元的介绍 什么是友元?友元是C++中的一种关系友元关系发生在函数与类之间或者类与类之间友元关系是单项的,不能传递...

  • 8-C++远征之继承篇-学习笔记

    C++远征之继承篇 开篇介绍 整个C++远征计划: 起航->离港->封装->继承 为什么要用继承? 为什么要有继承...

  • C++友元

    friend类: 如果class A想让class B访问它的成员,只需要在class A中将class B声明称...

网友评论

    本文标题:1.0 C++远征:友元

    本文链接:https://www.haomeiwen.com/subject/uuqspttx.html