C++知识整合-友元
C++中的友元是封装机制的补充,是一种特殊的访问权限机制,它允许一个类或者函数访问另一个类的私有成员。但是也由于友元破坏了private所具有的封装性,所以它的使用需要谨慎。
但是友元的访问是单向的,如果我定义A类将B类声明为友元,那么只能B访问A,而A不能访问B。
友元可以作用与类或者函数,前文也说明了,下面会分开讲。
需要记住,友元使用“friend”关键字来实现。
(一)友元函数:
先看到主题,代码中公有修饰一个友元函数showVolume,这只是先进行了声明,之后我们会在这个类的外部进行定义,之后我们就可以通过这个这个友元函数从外部访问私有成员volume。
公有修饰的里面还定义了一个构造函数用于给变量volume传值初始化,想了解构造函数的去我主页looklook。
再来到主函数,首先创建BOX类的对象myBox,由于构造函数的定义,创建类对象时自动调用该类中的构造函数。创建对象的同时我们给这个对象赋予了一个整形的数值10,由构造函数传给volume完成初始化。主函数第二段调用友元函数输出volume的值,但是是修饰的友元函数,所以我们可以访问到私有的成员变量volume。输出为10.
#include <iostream>
class Box {
private:
int volume;
public:
Box(int v) : volume(v) {}
friend void showVolume(const Box&);
};
void showVolume(const Box& b) {
std::cout << "volume: " << b.volume << std::endl;
}
int main() {
Box myBox(10);
showVolume(myBox);
return 0;
}

(二)友元类
A类中设置声明一个由“friend”修饰的友元类B为主要例子,再设置一个私有变量privateDataA并初始化作为友元类能调用私有变量的例子。
B类中为A类中声明的友元类B的实现,定义一个成员函数printPrivateDataA函数用于输出从A类中调用的privateDataA变量的值。那么这个值我们怎么来的呢?printPrivateDataA函数接受一个A类的对象,再有函数体输出这个对象调用A类中的私有变量privateDataA。
来到主函数,分别创建A类和B类的对象objA和objB。第三段再由B类的对象objB调用B类中的成员函数printPrivateDataA,再由参数传递的形式将对象objA传给printPrivateDataA函数完成对A类privateDataA变量的调用并输出。
#include <iostream>
using namespace std;
class A {
friend class B;
private:
int privateDataA = 10;
};
class B {
public:
void printPrivateDataA(A& objA) {
cout << "privateDataA:" << objA.privateDataA << endl;
}
};
int main() {
A objA;
B objB;
objB.printPrivateDataA(objA);
return 0;
}

个理限!有漏指!互学!求!!!!!!

浙公网安备 33010602011771号