当在一个类的成员函数外,想要修改类的私有成员时,就可以考虑使用友元。
使用前提:
某个类需要实现某种功能,但是这个类自身,因为各种原因,无法自己实现。
需要借助于“外力”才能实现。
友元函数 和 友元类
在main方法中定义,并实现;
在类中声明一下即可。(使用friend声明)
例:
需求:
给一个电脑的cpu从i7升级到i9
Computer.h
#pragma once
#include
using namespace std;
class Computer {
public:
Computer(void);
~Computer(void);
string description() const;
private:
string cpu;
// 把外部的全局函数pudate,声明为这个类的友元函数
friend void update(Computer *cpu);
};
Computer.cpp
#include
#include
#include "Computer.h"
Computer::Computer(void)
{
this->cpu = "i7";
}
Computer::~Computer(void)
{
}
string Computer::description() const {
stringstream ret;
ret << "cpu:" << cpu << endl;
return ret.str();
}
main
#include
#include "Computer.h"
void update(Computer *cpu) {
cpu->cpu = "i9";
}
int main(void) {
Computer cpu;
cout << cpu.description() << endl;
update(&cpu);
cout << cpu.description() << endl;
system("pause");
return 0;
}
运行截图:
友元函数仅在只有一个或者两个友元函数时使用时挺方便的,当友元函数有多个的时候,就需要使用友元类来封装,会比较简洁。
简单介绍:
有一个A类和一个B类。
在B类中有一个成员成员函数时A类的友元函数
假设A类时Computer, B类时ComputerServer
那么,在A类中需要这样声明:
friend void ComputerServer::update(Computer *cpu);
注意:
在ComputerServer.h文件中使用 class Computer;
声明一下有这个类;
在ComputerSever.cpp 文件中使用 头文件#include "Computer"
功能上,以上两种方式,都是相同,应用场合不同。
一个是,使用普通的全局函数,作为自己的朋友,实现特殊功能。
一个是,使用其他类的成员函数,作为自己的朋友,实现特殊功能。
友元类,故名思意就是一个类,是一个类的友元类。
友元类里面的所有成员函数都可以访问该类的所有私有成员。
友元类就是友元函数的封装。
C++是面向对象的,目的之一:封装
封装:
优点之一,就是安全。
缺点:在某些特殊的场合,不是很方便。
如果把A类作为B类的友元类,
那么A类的所有成员函数【在A类的成员函数内】,就可以直接访问【使用】B类的私有成员。
即,友元类可以直接访问对应类的所有成员!!!
例:
Computer.h
#pragma once
#include
#include "ComputerServer.h"
using namespace std;
class Computer {
public:
Computer(void);
~Computer(void);
string description() const;
private:
string cpu;
// 将ComputerServer整个类声明为Computer的友元类
friend class ComputerServer;
};
Computer.cpp
#include
#include
#include "Computer.h"
Computer::Computer(void)
{
this->cpu = "i7";
}
Computer::~Computer(void)
{
}
string Computer::description() const {
stringstream ret;
ret << "cpu:" << cpu << endl;
return ret.str();
}
ComputerServer.h
#pragma once
class Computer;
class ComputerServer {
public:
void update(Computer *cpu);
void clear(Computer *cpu);
void kiil(Computer &cpu); // 使用指针和使用引用效果一样
};
ComputerServer.cpp
#include
#include "ComputerServer.h"
#include "Computer.h"
void ComputerServer::update(Computer *cpu) {
cpu->cpu = "i9";
}
void ComputerServer::clear(Computer *cpu) {
cout << "正在对电脑清理垃圾【cpu:" << cpu->cpu << "】..." << endl;
}
void ComputerServer::kiil(Computer &cpu) {
cout << "正在对电脑清理杀毒【cpu:" << cpu.cpu<< "】..." << endl;
}
main
#include
#include "Computer.h"
#include "ComputerServer.h"
//void update(Computer *cpu) {
// cpu->cpu = "i9";
//}
int main(void) {
Computer cpu;
ComputerServer server;
cout << cpu.description() << endl;
//update(&cpu);
server.update(&cpu);
server.clear(&cpu);
server.kiil(cpu);
cout << cpu.description() << endl;
system("pause");
return 0;
}
运行截图:
友元类,和友元函数,使用friend关键字进行声明即可,与访问权限无关,
所以,可以放在private/pulic/protected任意区域内。