📜  C++朋友函数和朋友类

📅  最后修改于: 2020-09-25 04:52:59             🧑  作者: Mango

在本教程中,我们将学习借助示例在C++中创建朋友函数和朋友类的方法。

数据隐藏是面向对象编程的基本概念。它限制了班级外部私人成员的访问。

同样,受保护的成员只能由派生类访问,并且不能从外部访问。例如,

class MyClass {
    private:
        int member1;
}

int main() {
    MyClass obj;

    // Error! Cannot access private members from here.
    obj.member1 = 5;
}

但是,C++中有一个称为“ 朋友函数”的功能可以打破该规则,并允许我们从类外部访问成员函数。

同样,也有一个朋友类 ,我们将在本教程的后面部分学习。

C++中的friend函数

朋友函数可以访问类的私有数据和受保护的数据。我们使用类主体内的friend关键字声明一个friend 函数 。

class className {
    ... .. ...
    friend returnType functionName(arguments);
    ... .. ...
}

示例1:朋友功能的工作

// C++ program to demonstrate the working of friend function

#include 
using namespace std;

class Distance {
    private:
        int meter;
        
        // friend function
        friend int addFive(Distance);

    public:
        Distance() : meter(0) {}
        
};

// friend function definition
int addFive(Distance d) {

    //accessing private members from the friend function
    d.meter += 5;
    return d.meter;
}

int main() {
    Distance D;
    cout << "Distance: " << addFive(D);
    return 0;
}

输出

Distance: 5

在这里, addFive()是一个朋友函数 ,可以访问私有公共数据成员。

尽管此示例使我们对朋友函数的概念有所了解,但并未显示任何有意义的用途。

更有意义的用途是对两个不同类的对象进行操作。那时,朋友函数会非常有帮助。

示例2:添加两个不同类的成员

// Add members of two different classes using friend functions

#include 
using namespace std;

// forward declaration
class ClassB;

class ClassA {
    
    public:
        // constructor to initialize numA to 12
        ClassA() : numA(12) {}
        
    private:
        int numA;
        
         // friend function declaration
         friend int add(ClassA, ClassB);
};

class ClassB {

    public:
        // constructor to initialize numB to 1
        ClassB() : numB(1) {}
    
    private:
        int numB;
 
        // friend function declaration
        friend int add(ClassA, ClassB);
};

// access members of both classes
int add(ClassA objectA, ClassB objectB) {
    return (objectA.numA + objectB.numB);
}

int main() {
    ClassA objectA;
    ClassB objectB;
    cout << "Sum: " << add(objectA, objectB);
    return 0;
}

输出

Sum: 13

在此程序中, ClassAClassB已将add()声明为好友函数。因此,该函数可以访问两个类的私有数据。

这里要注意的一件事是ClassA内的friend 函数正在使用ClassB 。但是,我们目前尚未定义ClassB

// inside classA 
friend int add(ClassA, ClassB);

为此,我们需要在程序中ClassB声明ClassB

// forward declaration
class ClassB;

C++中的friend类

我们还可以通过使用friend关键字在C++中使用friend类。例如,

class ClassB;

class ClassA {
   // ClassB is a friend class of ClassA
   friend class ClassB;
   ... .. ...
}

class ClassB {
   ... .. ...
}

将某个类声明为朋友类时,该朋友类的所有成员函数都将成为朋友函数。

由于classB是一个朋友类,因此我们可以从classB内部访问classA所有成员。

但是,我们无法从classA内部访问ClassB成员。这是因为C++中的朋友关系仅被授予而不被接受。

示例3:C++朋友类

// C++ program to demonstrate the working of friend class

#include 
using namespace std;

// forward declaration
class ClassB;

class ClassA {
    private:
        int numA;

        // friend class declaration
        friend class ClassB;

    public:
        // constructor to initialize numA to 12
        ClassA() : numA(12) {}
};

class ClassB {
    private:
        int numB;

    public:
        // constructor to initialize numB to 1
        ClassB() : numB(1) {}
    
    // member function to add numA
    // from ClassA and numB from ClassB
    int add() {
        ClassA objectA;
        return objectA.numA + numB;
    }
};

int main() {
    ClassB objectB;
    cout << "Sum: " << objectB.add();
    return 0;
}

输出

Sum: 13

在这里, ClassBClassA的朋友类。因此, ClassB可以访问classA的成员。

ClassB ,我们创建了一个add() 函数 ,该函数返回numAnumB的总和。

由于ClassB是一个朋友类,因此我们可以在ClassB内创建ClassA对象。