1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Листинг #1 дружественные функции класса clang #include <iostream> class MyClass{ int x; //переменная, сокрытая секцией private public: void foo(MyClass obj); //прототип обычной функции, функция класса вынесена за класс MyClass():x(100){} //конструктор класса, просто для задания значения в x }; void foo(MyClass obj){ //функция, не являющаяся частью MyClass не имеет права лезть в секцию private класса MyClass std::cout << obj.x; //ошибка } int main(){ MyClass x; //создаём объект x, тип выбран MyClass foo(x); //вызываем обычную функцию, не функцию класса } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//Листинг #2.1 дружественная функция класса clang #include <iostream> class MyClass{ int x; public: void foo(MyClass obj); MyClass():x(100){} }; void MyClass::foo(MyClass obj){ //<-- сделали функцию частью класса std::cout << obj.x; } int main(){ MyClass x; //создаём объект x, тип выбран MyClass // foo(x); //так нельзя, нет функции foo x.foo(x); //вызов через объект, потому что функция foo часть класса MyClass } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//Листинг #2.2 обычная функция класса clang #include <iostream> class MyClass{ int x; public: void friend foo(MyClass obj); //<-- зафрендили функцию, показав классу прототип MyClass():x(100){} }; void foo(MyClass obj){ //<-- обычная функция std::cout << obj.x; } int main(){ MyClass x; //создаём объект x, тип выбран MyClass foo(x); //обычная функция foo есть, она срабатывает, благодаря friend // x.foo(x); //вызов через объект, но у класса нет функции foo, ошибка } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//Листинг #2.3 обычная функция класса clang #include <iostream> class MyClass{ int x; void friend foo(MyClass obj); //<-- зафрендили функцию, показав классу прототип (В private!!!) public: MyClass():x(100){} }; void foo(MyClass obj){ //<-- обычная функция std::cout << obj.x; } int main(){ MyClass x; //создаём объект x, тип выбран MyClass foo(x); //обычная функция foo есть, она срабатывает, благодаря friend // x.foo(x); //вызов через объект, но у класса нет функции foo, ошибка } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//Листинг #3 обычная функция класса clang class MyClass{ void friend foo(); //<-- зафрендили функцию, показав классу прототип }; void foo(){} int main(){ MyClass x; foo(); //дружественная функция есть, но смысла в ней нет } |
😳
➡ «При этом первый вариант работы то же самое, что и второй.»
То есть, как понимаю, использование дружественной функции — дело вкуса? Весомых аргументов в её пользу как-то не увидел, либо плохо читал… Можно ведь спокойно без неё жить и использовать обычную функцию Класса?..
то, что я не описал преимуществ не значит, что их нет. Иногда использование дружественных функций удобно использовать, иногда нет. Но если стремиться к максимальной абстракции, то использовать их надо как можно пореже.
Я видел, что их часто используют при перегрузках операторов и при полиморфизме.
А не описаны преимущества потому что я этот сайт делал один и, разумеется, не во всем хорошо разобрался. Я уже писал, что слабоват, хотя немного получше некоторых создателей похожих сайтов. Чтобы не вводить в заблуждения читателей, я старался избегать то, в чем слабо понимаю.
Автору огромное спасибо, всё доступно написано, каждая строчка закомментирована и понятна, это боооольшой плюс)
спасибо ещё раз))
Сайт просто супер! Спасибо за уроки!