zoukankan      html  css  js  c++  java
  • 《新标准C++程序设计》3.8(C++学习笔记10)

    友元

    友元分为友元函数和友元类两种。

    一、友元函数

    在定义一个类的时候,可以把一些函数(包括全局函数和其它类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。

    全局函数声明为友元的写法如下:

    friend返回值类型 函数名(参数表);

    其他类的成员函数声明为友元的写法入下:

    friend返回值类型 其他类的类名::成员函数名(参数表);

    但是,不能把其他类的私有成员函数声明为友元

    #include<iostream>
    using namespace std;
    class CCar;                                               //提前声明 CCar类,以便后面的CDriver类使用
    class CDriver
    {
    public:
        void ModifyCar(CCar* pCar);                           //改装汽车
    };
    class CCar
    {
    private:
        int price;
        friend int MostExpensiveCar(CCar cars[], int total); //声明友元
        friend void CDriver::ModifyCar(CCar* pCar);          //声明友元
    };
    void CDriver::ModifyCar(CCar* pCar)
    {
        pCar->price += 1000;                                 //汽车改装后价值增加
    }
    int MostExpensiveCar(CCar cars[], int total)             //求最贵汽车的价格
    {
        int tmpMax = -1;
        for (int i = 0; i < total; ++i)
            if (cars[i].price > tmpMax)
                tmpMax = cars[i].price;
        return tmpMax;
    }
    int main()
    {
        return 0;
    }

    可以将一个类的成员函数(包括构造、析构函数)说明为另一个类的友元。

    class B {
    public:
    void function();
    };
    class A {
    friend void B::function();
    };

    二、友元类

    一个类A可以将另一个类B声明为自己的友元,类B的所有成员函数就可以访问类A对象的私有成员。在类定义中声明友元类的写法如下:

    friend class 类名;

    class CCar
    {
    private:
        int price;
        friend class CDriver;     //声明CDriver为友元类
    };
    class CDriver
    {
    public:
        CCar myCar;
        void ModifyCar() {        //改装汽车
            myCar.price += 1000;  //因CDriver是CCar的友元类,故此处可以访问其私有成员
        }
    };
    int main() { 
        return 0;
    }

    友元类之间的关系不能传递,不能继承。

  • 相关阅读:
    java中&和&&是怎么运算的
    struts中ActionForward 使用mapping.findForward如何传递get参数
    EL表达式_详解
    JSTL标签_详解
    inner join, left join, right join, full join 的区别
    CentOS7部署FastDFS+nginx模块
    一个实例明白AutoResetEvent和 ManulResetEvent的用法
    C#防止在画面上闪烁的Button
    C#中给Label控件设置BackgroundImage属性
    浅析C#异步操作
  • 原文地址:https://www.cnblogs.com/cyn522/p/12284061.html
Copyright © 2011-2022 走看看