C++ 代码中的朋友:友元

为什么要使用友元

当在一个类的成员函数外,想要修改类的私有成员时,就可以考虑使用友元。

使用前提:
某个类需要实现某种功能,但是这个类自身,因为各种原因,无法自己实现。
需要借助于“外力”才能实现。


友元的两种使用形式

友元函数 和 友元类


友元函数

在main方法中定义,并实现;
在类中声明一下即可。(使用friend声明)

例:

需求:
给一个电脑的cpu从i7升级到i9

Computer.h

#pragma once
#include <string>

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 <iostream>
#include <sstream>
#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 <iostream>
#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 <string>
#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 <iostream>
#include <sstream>
#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 <iostream>
#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 <iostream>
#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任意区域内。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值