📜  C++中类与示例的相互友谊

📅  最后修改于: 2021-10-28 02:34:23             🧑  作者: Mango

先决条件: C++中的朋友类
朋友类可以访问其他类的私有成员和受保护成员,在这些成员中它被声明为朋友。允许特定类访问另一个类的私有成员有时很有用。
下面是说明朋友类的程序:

CPP
// C++ program to illustrate friend class
#include 
using namespace std;
 
// Class A
class A {
private:
    // Private member of Class A
    int a;
 
public:
    // Constructor to initialise private
    // member of class A
    A() { a = 0; }
 
    // Make friend class B using a friend
    // keyword
    friend class B;
};
 
// Class B
class B {
private:
    // Private members of class B
    int b;
 
public:
    // Members function of class B
    void showA(A& x)
    {
        // Since B is friend of A,
        // it can access private members
        // of class A
        cout << "Accessed Private "
             << "Member of class A\n";
        cout << "A::a = " << x.a;
    }
};
 
int main()
{
    // Object of class A
    A a;
 
    // Object of class B
    B b;
 
    // Member function of friend class B
    b.showA(a);
    return 0;
}


CPP
// C++ program to illustrate mutual
// friendship of classes
#include 
using namespace std;
 
// Forward Declaration
class B;
 
// Class A
class A {
 
    // Member of class A
    int data;
 
public:
    // Make B as a friend of class A
    friend class B;
 
    // Constructor to initialise member
    // of class A
    A(int d) { data = d; }
 
    // Function to get data of friend
    // class B
    void get_data_B(B objb);
};
 
// Class B
class B {
 
    // Member of class B
    int dataB;
 
public:
    // Making A a friend of class B
    friend class A;
 
    // Constructor to initialise member of
    // class B
    B(int d) { dataB = d; }
 
    // Function to get the data of
    // friend class A
    void get_data_A(A obja)
    {
        cout << "Data of A is: "
             << obja.data;
    }
};
 
// Function for accessing friend class
// B's object
void A::get_data_B(B objb)
{
    cout << "Data of B is: "
         << objb.dataB;
}
 
// Driver Code
int main()
{
 
    // Object of class A
    A a(10);
 
    // Object of class B
    B b(20);
 
    // Print data of class A
    b.get_data_A(a);
    cout << endl;
 
    // Print data of class B
    a.get_data_B(b);
    return 0;
}


输出:
Accessed Private Member of class A
A::a = 0

类的相互友谊:对于 A 类和 B 类,如果 A 类是 B 类的朋友类,B 类是 A 类的朋友类,则称 A 类和 B 类相互友好。 由于这两个类之间建立了友谊,双方这些类可以使用自己的成员函数访问彼此的受保护成员和私有成员。
在这两个类中正常进行声明和定义函数时,会遇到一个常见的语法错误,这表明首先声明的类即使成为朋友也无法访问后继类的数据成员。
所以友谊不是相互的。如果A 类B的朋友,那么B不会自动成为A 类的朋友。
但是我们可以通过避免上面发生的错误来使类相互友好,第一个类中访问第二个类的数据成员的函数在第二个类之后使用范围解析运算符。
让我们假设类 A在程序中首先定义,而类 B类 A之后定义。类 A 中访问类 B数据的成员函数应在类 B之后定义。这样做是为了确保编译器首先读取类 B ,后者反过来将向编译器提供信息,即类 A类 B的朋友,因此被允许访问其成员。
以下是说明班级相互友谊的程序:

CPP

// C++ program to illustrate mutual
// friendship of classes
#include 
using namespace std;
 
// Forward Declaration
class B;
 
// Class A
class A {
 
    // Member of class A
    int data;
 
public:
    // Make B as a friend of class A
    friend class B;
 
    // Constructor to initialise member
    // of class A
    A(int d) { data = d; }
 
    // Function to get data of friend
    // class B
    void get_data_B(B objb);
};
 
// Class B
class B {
 
    // Member of class B
    int dataB;
 
public:
    // Making A a friend of class B
    friend class A;
 
    // Constructor to initialise member of
    // class B
    B(int d) { dataB = d; }
 
    // Function to get the data of
    // friend class A
    void get_data_A(A obja)
    {
        cout << "Data of A is: "
             << obja.data;
    }
};
 
// Function for accessing friend class
// B's object
void A::get_data_B(B objb)
{
    cout << "Data of B is: "
         << objb.dataB;
}
 
// Driver Code
int main()
{
 
    // Object of class A
    A a(10);
 
    // Object of class B
    B b(20);
 
    // Print data of class A
    b.get_data_A(a);
    cout << endl;
 
    // Print data of class B
    a.get_data_B(b);
    return 0;
}
输出:
Data of A is: 10
Data of B is: 20

在上面的程序中, AB班是共同的朋友。因此,访问类 A 的私有成员也可以通过类 B 的成员函数进行,访问类 B 的私有成员也可以通过类 A 的成员函数进行。

想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解基础加 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程