zoukankan      html  css  js  c++  java
  • 友元函数

    类的友元函数是定义在类外部,但有权访问类的所有私有成员和保护成员。尽管友元函数的原型有在类的定义中出现过,但友元函数并不是成员函数。

    友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。在这种情况下,整个类及其所有成员都是友元。如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字friend,如下所示:

    class Box
    {
        double width;
    public:
        double length;
        friend void printWidth(Box box);
        void setWidth(double wid);    
    };

    声明类ClassTwo的所有成员函数作为类的ClassOne的友元,需要在类ClassOne的定义中放置如下声明:

    friend class ClassTwo;
    /***
    friend.cpp
    ***/
    #include<iostream>
    using namespace std;
    
    class Box
    {
        double width;
    public:
        friend void printWidth(Box box);
        void setWidth(double wid);
    };
    
    void Box::setWidth(double wid)
    {
        width = wid;
    }
    
    void printWidth(Box box)
    {
        cout << "Width of box : " << box.width << endl;
    }
    
    int main()
    {
        Box box;
        
        box.setWidth(10.0);
        printWidth(box);
        return 0;
    }

    运行结果:

    exbot@ubuntu:~/wangqinghe/C++/20190807$ ./friend

    Width of box : 10

    因为友元函数没有this指针,则参数要有三种情况:

    1. 要访问非static成员时,需要对象作为参数;
    2. 要访问static成员或者全局变量时,不需要对象作为参数;
    3. 如果做参数的对象是全局对象,则不需要对象做参数。

    友元类的使用

    /***
    classfriend.cpp
    ***/
    #include<iostream>
    using namespace std;
    
    class Box
    {
        double width;
    public:
        friend void printWidth(Box box);
        friend class BigBox;
        void setWidth(double wid);
    };
    
    class BigBox
    {
    public:
        void Print(int width, Box &box)
        {
            box.setWidth(width);
            cout << "Width of box: " << box.width << endl;
        }
    };
    
    void Box::setWidth(double wid)
    {
        width = wid;
    }
    
    void printWidth(Box box)
    {
        cout << "Width of box : " << box.width << endl;
    }
    
    int main()
    {
        Box box;
        BigBox big;
        
        box.setWidth(10.0);
    
        printWidth(box);
    
    big.Print(20,box);
        return 0;
    }

    运行结果:

    exbot@ubuntu:~/wangqinghe/C++/20190807$ ./classfriend

    Width of box : 10

    Width of box: 20

  • 相关阅读:
    GhostScript命令参数详解(转)
    西安电子科技大学week02-问题规约表示及其搜索技术
    西安电子科技大学week01-状态空间表示及其问题解决
    canal同步mysql数据
    Navicat连接mysql数据库报错2003
    fieldset可以实现在虚线框中写文字
    CSS盒模型简单介绍
    js变量数组和对象常用方法
    js数组方法大全
    IIFE和闭包和let
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/11316598.html
Copyright © 2011-2022 走看看