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

 

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

posted @ 2024-04-15 18:20  小程GK  阅读(43)  评论(0)    收藏  举报