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