Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
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++

Функция друга может получить доступ к личному и защищено данные класса. Мы объявляем функцию друга, используя 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() — это функция друга, которая может получить доступ как к личным и общедоступно элементы данных.

Хотя этот пример дает нам представление о концепции функции друга, он не показывает никакого значимого использования.

Более осмысленным использованием было бы оперирование объектами двух разных классов. Вот когда функция друга может быть очень полезной.

<час>

Пример 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

В этой программе ClassA и ClassB объявили add() как функция друга. Таким образом, эта функция может получить доступ к частным данные обоих классов.

Здесь следует обратить внимание на функцию друга внутри ClassA. использует ClassB . Однако мы не определили ClassB на данный момент.

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

Чтобы это работало, нам нужно предварительное объявление ClassB в нашей программе.

// forward declaration
class ClassB;
<час>

класс друга в C++

Мы также можем использовать дружественный класс в C++, используя friend ключевое слово. Например,

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

Здесь ClassB является дружественным классом для ClassA . Итак, ClassB имеет доступ к членам classA .

В ClassB , мы создали функцию add() который возвращает сумму numA и числоB .

С ClassB является дружественным классом, мы можем создавать объекты ClassA внутри ClassB .


Язык C

  1. Класс и объект С#
  2. Абстрактный класс и метод С#
  3. Частичный класс C# и частичный метод
  4. Запечатанный класс и метод С#
  5. Классы и объекты С++
  6. Разница между структурой и классом:объяснение на примере C++
  7. Java — объект и классы
  8. Классы хранения в C++
  9. Дата и время С++
  10. Перегрузка C++ (оператор и функция)