亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C++朋友函数和朋友类

C++朋友函数和朋友类

在本教程中,我们将通过示例学习在 C++ 中创建友元函数和友元类。

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

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

class MyClass {
    private:
        int member1;
}

int main() {
    MyClass obj;

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

但是,C++ 中有一个称为友元函数的特性 打破了这个规则,允许我们从类外访问成员函数。

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


C++ 中的朋友函数

好友功能 可以访问private 并且受保护 一个类的数据。我们使用 friend 声明一个友元函数 类主体中的关键字。

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

示例1:朋友函数的工作

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

#include <iostream>
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() 是一个好友函数,可以同时访问private公开 数据成员。

虽然这个例子让我们了解了朋友功能的概念,但它并没有显示出任何有意义的用途。

更有意义的用途是对两个不同类的对象进行操作。这时候朋友功能就很有用了。


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

// Add members of two different classes using friend functions

#include <iostream>
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() 作为朋友功能。因此,这个函数可以访问 private 两个类的数据。

这里要注意的一件事是 ClassA 中的朋友函数 正在使用 ClassB .但是,我们还没有定义 ClassB 此时。

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

为此,我们需要 ClassB 的前向声明 在我们的程序中。

// forward declaration
class ClassB;

C++中的朋友类

我们还可以使用 friend 在 C++ 中使用朋友类 关键词。例如,

class ClassB;

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

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

当一个类被声明为友元类时,友元类的所有成员函数都成为友元函数。

ClassB 是一个朋友类,我们可以访问ClassA的所有成员 从 ClassB 内部 .

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


示例3:C++朋友类

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

#include <iostream>
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() 返回 numA 的总和 和 numB .

ClassB 是一个朋友类,我们可以创建ClassA的对象 ClassB 内部 .


C语言

  1. C# 类和对象
  2. C#抽象类和方法
  3. C# 部分类和部分方法
  4. C# 密封类和方法
  5. C++ 类和对象
  6. 结构和类的区别:用 C++ 示例解释
  7. Java - 对象和类
  8. C++ 中的存储类
  9. C++ 日期和时间
  10. C++ 重载(运算符和函数)
  11. C++中的多态性
  12. C++ 中的数据抽象