zoukankan      html  css  js  c++  java
  • 友元类

    ----------------siwuxie095

       

       

       

       

       

       

       

       

       

    友元类

       

       

    友元类的定义与友元函数的定义非常类似

       

    看如下实例:

       

    定义一个坐标类:Coordinate

       

       

       

    使用方法:使用 friend 关键字跟一个类的类名即可

       

    需要注意的是:

       

    如果我们声明一个友元类 Circle,需要在 Coordinate 类的前面,先声明

    一下 Circle 类,只需写上 class Circle; 即可,这就是告诉计算机,我其实

    是有这个类的,在这先用一下,后续再将这个类的主体编译进来

       

    这样做才不会造成 friend Circle; 这行代码的错误

       

       

    当我们将 Circle 类声明为 Coordinate 类的友元类之后,就可以

    在 Circle 类中去定义一个 Coordinate 类的对象,并通过该对象

    任意的访问 Coordinate 类中的私有的数据成员和成员函数

       

       

       

    当定义 Circle 类时:

       

       

       

    Circle 类的 private 下定义了一个 Coordinate 对象,则在 Circle

    类的任何成员函数中,都可以通过该对象来访问 Coordinate 类中的

    私有数据成员和成员函数

       

       

       

    关于友元的注意事项:

       

       

       

    1)友元关系不可传递,如:B 是 A 的朋友,C 是 B 的

    朋友,那么 C 未必是 A 的朋友

       

    2)友元关系的单向性,如:A 是 B 的朋友,B 就不一定

    是 A 的朋友,所以在声明友元时,一定要搞清楚到底 A 是

    B 的友元,还是 B 是 A 友元

       

    3)声明友元时,可以既有友元函数,又有友元类,而且

    在声明数量上也是不受限制的

       

       

       

    需要特别注意的是:友元只是封装的一种补充,它并不是一种很好

    的语法

       

       

       

    是不得以而为之,如果在前期设计巧妙的话,实际上是可以避开

    使用友元的

       

    也就是说,友元的使用破坏了封装性,使得我们的类的封装性看上去

    更差,同时也体现了一种定向暴露的思想,即 我把谁当做朋友,就相

    当于把数据定向暴露给谁

       

       

       

       

       

    程序:

       

    Time.h:

       

    #ifndef TIME_H

    #define TIME_H

       

       

    class Match;//注意这里要声明

    class Time

    {

    //声明友元类

    friend Match;

    public:

    Time(int hour, int min, int sec);

    private:

    void printTime();

    int m_iHour;

    int m_iMinute;

    int m_iSecond;

    };

       

    #endif // !TIME_H

       

       

       

    Time.cpp:

       

    #include "Time.h"

    #include<iostream>

    using namespace std;

       

       

    Time::Time(int hour, int min, int sec)

    {

    m_iHour = hour;

    m_iMinute = min;

    m_iSecond = sec;

    }

       

    void Time::printTime()

    {

    cout << m_iHour << "" << m_iMinute << "" << m_iSecond <<""<< endl;

    }

       

       

       

    Match.h:

       

    #ifndef MATCH_H

    #define MATCH_H

       

    #include "Time.h"

       

    class Match

    {

    public:

    Match(int hour, int min, int sec);

    void testTime();

    private:

    Time m_tTimer;

    };

    #endif

       

       

       

    Match.cpp:

       

    #include "Match.h"

    #include <iostream>

    using namespace std;

       

       

    //通过初始化列表将 m_tTimer 进行初始化

    // 只要实例化 Match,它当中的 m_tTimer 就会被实例化

    //并且所得到的三个参数是通过 Match 的构造函数传入的三个参数得到的

    Match::Match(int hour, int min, int sec) :m_tTimer(hour,min,sec)

    {

       

    }

       

    void Match::testTime()

    {

    m_tTimer.printTime();

    cout << m_tTimer.m_iHour << ":" << m_tTimer.m_iMinute << ":" << m_tTimer.m_iSecond << endl;

       

    }

       

       

       

    main.cpp:

       

    #include "stdlib.h"

    #include "Match.h"

    using namespace std;

       

       

    int main(void)

    {

    Match m(6, 30, 56);

    m.testTime();

    system("pause");

    return 0;

    }

       

    //友元函数也好 友元类也好 其实都只是封装的补充

    //并不是一个很好的语法 是不得已而为之所用的语法

    //

    //如果在前期设计巧妙 实际上是可以避开使用友元的

    //

    //友元的使用 破坏了封装性 使得我们的类的封装性看上去更差

    //

    //同时也体现了一种定向暴露的思想 那么我把谁当作朋友

    //就相当于将数据定向的暴露给谁

       

       

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    Centos下 安装和测试kafka
    Java枚举
    Java 数组
    Java变量
    Java标识符
    Java修饰符
    java 基本语法
    Java 基础语法
    Java开发工具
    JAVA 发展历史
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6814499.html
Copyright © 2011-2022 走看看