友元函数和友元类

一 友元函数

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

1.1 使用全局函数作为友元函数

将全局函数声明为友元的写法:friend 返回值类型 函数名(参数表);

//------------ Computer类  -------------------
/* Computer.h */
#pragma once
#include <string>
using namespace std;

class Computer
{
public:
    Computer();
    ~Computer();
    string description();
private:
    // 使用全局函数作为友元函数
    friend void upgrade(Computer* computer);
    string cpu;
};

/* Computer.cpp */
#include "Computer.h"
#include <sstream>

Computer::Computer()
{
    this->cpu = "i7";
}

Computer::~Computer()
{
}

string Computer::description()
{
    stringstream ret;
    ret << "cpu:" << cpu;
    return ret.str();
}

//-------------  main.cpp  -------------------
#include <iostream>
#include "Computer.h"
using namespace std;

// 使用全局函数作为Computer类的友元函数
void upgrade(Computer* computer)
{
    computer->cpu = "i9";  // 可以直接访问私有成员
}

int main()
{
    Computer c1;
    cout << c1.description() << endl;

    cout << "进行升级" << endl;
    upgrade(&c1);
    cout << c1.description() << endl;
    return 0;
}

image

1.2 使用类的成员函数作为友元函数

将其他类的成员函数声明为友元的写法:friend 返回值类型 其他类的类名::成员函数名(参数表);
注意:不能把其他类的私有成员函数声明为友元。

#include <iostream>
#include <string>
#include <sstream>

using namespace std;
class Computer;

class ComputerService
{
public:
    void upgrade(Computer* computer);
    //{
    //    computer->cpu = "i9";  //在这里写报错,因为友元声明在下面
    //}
};

class Computer
{
public:
    Computer() { this->cpu = "i7"; }
    ~Computer() {}
    string description()
    {
        stringstream ret;
        ret << "cpu:" << cpu;
        return ret.str();
    }

    // 使用类的成员函数作为友元函数
    friend void ComputerService::upgrade(Computer* computer);
private:
    string cpu;
};

void ComputerService::upgrade(Computer* computer)
{
    computer->cpu = "i9";
}

int main()
{
    Computer c1;
    ComputerService s1;
    cout << c1.description() << endl;
    cout << "升级后" << endl;
    s1.upgrade(&c1);
    cout << c1.description() << endl;

    return 0;
}

image

二 友元类

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

#include <iostream>
#include <string>
#include <sstream>

using namespace std;
class Computer;

class ComputerService
{
public:
    void upgrade(Computer* computer);
    //{
    //    computer->cpu = "i9";  //在这里写报错,因为友元声明在下面
    //}

    void clear(Computer* computer);
    void kill(Computer* computer);
};

class Computer
{
public:
    Computer() { this->cpu = "i7"; }
    ~Computer() {}
    string description()
    {
        stringstream ret;
        ret << "cpu:" << cpu;
        return ret.str();
    }

    // 友元类
    friend class ComputerService;
private:
    string cpu;
};

void ComputerService::upgrade(Computer* computer)
{
    computer->cpu = "i9";
}

void ComputerService::clear(Computer* computer)
{
    cout << "正在对cpu:" << computer->cpu << "清理" << endl;
}

void ComputerService::kill(Computer* computer)
{
    cout << "正在对cpu:" << computer->cpu << "杀毒" << endl;

}

int main()
{
    Computer c1;
    ComputerService s1;

    cout << c1.description() << endl;
    cout << "升级后" << endl;
    s1.upgrade(&c1);
    cout << c1.description() << endl;

    s1.clear(&c1);
    s1.kill(&c1);

    return 0;
}

image

posted @ 2022-05-05 22:49  荒年、  阅读(33)  评论(0编辑  收藏  举报