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

为什么使用友元:

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

友元的两种形式

友元函数,友元类

友元函数

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

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

全局函数: 

.h文件中

friend void update(Computer& h);

主函数文件中:

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

第十站(18天)C++面向对象-补充“友元“_第1张图片

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

第十站(18天)C++面向对象-补充“友元“_第2张图片

 第十站(18天)C++面向对象-补充“友元“_第3张图片

 .h

#pragma once
#include 
#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 

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 
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;

第十站(18天)C++面向对象-补充“友元“_第4张图片

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 << "正在清除"<cpu << endl;
}

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


#include "Computer.h"
#include "ComputerService.h"
#include 
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;
}

你可能感兴趣的:(齐牛编程,visual,studio,c++,面向对象)