zoukankan      html  css  js  c++  java
  • 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)友元声明的形式及数量不受限制

    • 友元只是封装的补充
    • 如果设计合理,不须用到友元
    • 定向暴露了数据
  • 相关阅读:
    比较重量(网易笔试题)
    抽象工厂模式
    简单工厂模式
    R语言dai xie
    Hadoop综合大作业
    hive基本操作与应用
    用mapreduce 处理气象数据集
    熟悉常用的HBase操作,编写MapReduce作业
    爬虫大作业
    第三章 熟悉常用的HDFS操作
  • 原文地址:https://www.cnblogs.com/xiaoqingyang/p/6077577.html
Copyright © 2011-2022 走看看