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

    • 友元只是封装的补充
    • 如果设计合理,不须用到友元
    • 定向暴露了数据
  • 相关阅读:
    关键词user附近有语法错误
    Java期末考试冲刺总结
    getElementsByName&getElementById
    window.location.herf传值问题
    三种提示框
    statement没有返回结果集问题
    ajax从jsp向servlet传值
    java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO)报错问题解决
    Unregistering application product with eureka with status DOWN
    输出废弃
  • 原文地址:https://www.cnblogs.com/xiaoqingyang/p/6077577.html
Copyright © 2011-2022 走看看