第十站(18天)C++面向对象-补充“友元“

发布时间:2024年01月18日

为什么使用友元:

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

友元的两种形式

友元函数,友元类

友元函数

使用全局函数作为友元函数[? 全局函数无法访问类的私有成员,要么改变访问权限,要么定义为友元函数?]

使用friend关键字就没有权限限制,,可以放在访问权限的任何位置(public,protected,private)

全局函数:?

.h文件中

friend void update(Computer& h);

主函数文件中:

void update(Computer& h) {
?? ?h.cpu = 'i9';//全局函数不能直接访问私有成员,设置为友元
}

?外类的成员函数需使用聚合(指针)

?

?.h

#pragma once
#include <string>
#include "ComputerService.h"//光声明是不够的
using namespace std;
class Computer{
public:
	string description();
	Computer();
	friend void ComputerService::update(Computer* computer);

private:
	string cpu;
	

};

#pragma once
class Computer;
class ComputerService
{
public:
	void update(Computer* computer);
};

.cpp

computer.cpp

#include "Computer.h"
#include <sstream>

Computer::Computer(){
	this->cpu = "i5";
}
string Computer::description()
{
	stringstream ret;
	ret << "cpu:" << cpu << endl;
	return ret.str();
}

computerService.cpp

#include "ComputerService.h"
#include "Computer.h"
void ComputerService::update(Computer* computer)
{
	computer->cpu = "i9";
}

主函数
#include "Computer.h"
#include "ComputerService.h"
#include <iostream>
using namespace std;
int main(void) {
	Computer h1;
	cout << h1.description() << endl;
	//使用友元之后
	cout << "使用友元外类成员函数之后" << endl;
	ComputerService h2;
	h2.update(&h1);
	cout << h1.description() << endl;

	return 0;
}

?外类作为友元需使用聚合(指针)

friend class ComputerService;

friend class ComputerService;


#pragma once
class Computer;
class ComputerService
{
public:
?? ?void update(Computer* computer);
?? ?void clean(Computer* computer);
?? ?void kill(Computer* computer);
};
#include "Computer.h"

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

void ComputerService::clean(Computer* computer)
{
?? ?cout << "正在清除"<<computer->cpu << endl;
}

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


#include "Computer.h"
#include "ComputerService.h"
#include <iostream>
using namespace std;
int main(void) {
?? ?Computer h1;
?? ?cout << h1.description() << endl;
?? ?//使用友元之后
?? ?cout << "使用友元外类成员函数之后" << endl;
?? ?ComputerService h2;
?? ?h2.update(&h1);
?? ?h2.clean(&h1);
?? ?h2.kill(&h1);
?? ?cout << h1.description() << endl;

?? ?return 0;
}

文章来源:https://blog.csdn.net/qq_48397625/article/details/135670920
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。