目录
友元的两种使用形式
友元函数、友元类。
1.友元函数(全局函数做友元)
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
class Computer {
//全局函数做友元,可以放在类内任意位置
friend void Upgrade(Computer* compt);
public:
Computer() {
this->cpu = "i7";
}
string DescriPtion() {
stringstream ret;
ret << "CPU:" << this->cpu;
return ret.str();
}
private:
string cpu;
};
//友元函数
void Upgrade(Computer *compt) {
compt->cpu = "i9";
}
int main() {
Computer compt;
cout << compt.DescriPtion() << endl;
Upgrade(&compt);
cout << compt.DescriPtion() << endl;
system("pause");
return 0;
}
2.友元哈函数(类的成员函数做友元)
将类B的成员函数做类A的友元
A.h
#pragma once
//因为要识别类B作用域下的函数,所有要添加头文件
#include"B.h"
class A {
public:
A();
int GetNumber();
//类的成员函数做友元
friend void B::numDouble(A* a);
private:
int temp;
};
A.cpp
#include "A.h"
A::A() {
this->temp = 10;
}
int A::GetNumber() {
return this->temp;
}
B.h
#pragma once
class A; //函数声明中仅识别类A就行
class B {
public:
void numDouble(A* a);
};
B.cpp
#include"B.h"
//要识别类A的实列对象中的成员,所有要添加头文件
#include"A.h"
void B::numDouble(A* a) {
a->temp *= 2;
}
main.cpp
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include "A.h"
#include "B.h"
using namespace std;
int main(void) {
A a;
B b;
cout << a.GetNumber() << endl;
b.numDouble(&a);
cout << a.GetNumber ()<< endl;
system("pause");
return 0;
}
运行结果:
3.友元类
友元类的作用:把A类作为B类的友元类,那么A类的所有成员函数,就可以直接访问【使用】B类的私有成员。即友元类可以直接访问对应类的所有成员。
A.h
#pragma once
//声明一下类
class B;
class A {
public:
A();
int GetNumber();
friend B;
private:
int temp;
};
A.cpp
#include "A.h"
A::A() {
this->temp = 10;
}
int A::GetNumber() {
return this->temp;
}
B.h
#pragma once
class A; //函数声明中仅识别类A就行
class B {
public:
void numDouble(A* a);
};
B.cpp
#include"B.h"
#include"A.h" //要识别类A的实列对象中的成员,所有要添加头文件
void B::numDouble(A* a) {
a->temp *= 2;
}
main.cpp
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include "A.h"
#include "B.h"
using namespace std;
int main(void) {
A a;
B b;
cout << a.GetNumber() << endl;
b.numDouble(&a);
cout << a.GetNumber ()<< endl;
system("pause");
return 0;
}
运行结果:
友元类,和友元函数,使用friend关键字进行声明即可,与访问权限无关,
所以,可以放在private/pulic/protected任意区域内。