• C++基础系列七:友元


    友元允许特定的非成员函数能够访问一个类的私有成员,同时阻止一般的访问。通过友元机制,一个类可以将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字friend开始,只能出现在类定义的内部,但可以出现在类中的任何地方,但通常将友元声明成组地放在类定义的开始或结尾。

    友元可以是其他的类,普通的非成员函数或其他类的成员函数,下面分别简要介绍。

    (1)类作为友元

    如果将一个类B声明为另一个类A的友元,那么这个友元类B的成员就可以直接访问A的私有成员,声明的格式如下:

    class A
    {
        friend class B;
    }

    (2)类的成员函数作为友元

    如果不是将整个类设为友元,而是将某个类B的成员函数设为另一个类A的友元函数,那么这个函数就可以访问A的私有成员,但是类B必须先于类A定义,另一方面,必须在定义A之后,B的那个成为友元的成员函数才能定义。代码示例如下:

    class B
    {
    public:
    //...
    void PrintAMember(int a); }; class A { friend void B::PrintAMember(B::int a); };

    (3)非成员函数作为友元

    也可以通过将一个普通的非成员函数设为一个类的友元而使其可以访问类的私有成员,如:

    class A
    {
    friend void f();
    };


    (4)代码示例

      1 /*********Head.h********/
      2 #ifndef HEAD_H
      3 #define HEAD_H
      4 #include<iostream>
      5 using namespace std;
      6 #include "Sales_Item.h"
      7 
      8 class Head
      9 {
     10 public:
     11     Head(){ }
     12     void PrintSalesItem(const Sales_Item& item)
     13     {
     14         cout<<item.isbn<<endl;
     15         cout<<item.units_sold<<endl;
     16         cout<<item.revenue<<endl;
     17     }
     18 private:
     19     int a;
     20     int b;
     21 };
     22 
     23 #endif
     24 
     25 /************Head2.h*************/
     26 #ifndef HEAD2_H
     27 #define HEAD2_H
     28 #include<iostream>
     29 using namespace std;
     30 
     31 class Head2
     32 {
     33 public:
     34     Head2()
     35     {
     36     }
     37     void PrintSalesISBN(const Sales_Item& item);
     38 
     39 };
     40 
     41 #endif
     42 
     43 
     44 /***************Sales_Item.h**************/
     45 #ifndef SALES_ITEM_H
     46 #define SALES_ITEM_H
     47 #include<string>
     48 #include "Head2.h"
     49 
     50 class Sales_Item
     51 {
     52 friend Sales_Item Add(const Sales_Item& item1, const Sales_Item& item2);
     53 friend class Head;    
     54 friend void Head2::PrintSalesISBN(const Sales_Item& item);
     55 public:
     56     Sales_Item(const string& book = "", const unsigned us = 0, double re = 0)
     57         :isbn(book),units_sold(us),revenue(re)
     58     {
     59 
     60     }
     61     Sales_Item(istream& is)
     62     {
     63         cin>>isbn>>units_sold>>revenue;
     64     }
     65 private:
     66     string isbn;
     67     unsigned units_sold;
     68     double revenue;
     69 };
     70 
     71 #endif
     72 
     73 
     74 /**************main.cpp*************/
     75 #include "stdafx.h"
     76 #include<iostream>
     77 using namespace std;
     78 #include<string>
     79 #include "Sales_Item.h"
     80 #include "Head.h"
     81 #include "Head2.h"
     82 
     83 Sales_Item Add(const Sales_Item& item1, const Sales_Item& item2)
     84 {
     85     Sales_Item temp;
     86     temp.isbn = item1.isbn;
     87     temp.units_sold = item1.units_sold + item2.units_sold;
     88     temp.revenue = item1.revenue + item2.revenue;
     89     cout<<temp.units_sold<<endl;
     90     return temp;
     91 }
     92 int _tmain(int argc, _TCHAR* argv[])
     93 {
     94     Sales_Item item1("hehe",3,4.12);
     95     Sales_Item item2("haha",3,4.13);
     96 
     97     Sales_Item item = Add(item1, item2);
     98     
     99     system("pause");
    100     return 0;
    101 }
    View Code
  • 相关阅读:
    windows 修复MBR引导
    【转】用BibTeX 写 Reference
    【转】CVPR 2010 有趣的文章
    如何扩充C盘空间
    Web项目架构设计
    on条件与where条件的区别
    虚方法(virtual)和抽象方法(abstract)的区别
    SQL Server的备份还原通用解决方案
    为什么需要防火墙
    用Javascript写的抽奖的小游戏
  • 原文地址:https://www.cnblogs.com/sophia-yun/p/3156412.html
Copyright © 2020-2023  润新知