Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
1

Что в данном случае означает friend?

16.12.2013, 02:32. Показов 1172. Ответов 10
Метки нет (Все метки)

Всем доброй ночи!

Не по теме:

Помню, кода-то очень давно мельком видел, что кто-то уже спрашивал аналогичный вопрос, но тогда не придал этому значение, так как абсолютно ничего не понимал, сейчас эту тему не нашёл...


Практически всегда вижу, что бинарные операторы обычно перегружают с использованием friend, например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
class MyStr{
    char Str[50];
public:
    MyStr(){}
    MyStr(const char *ptStr){
        strcpy(Str,ptStr);
    }
    friend MyStr operator + (const MyStr &l, const MyStr &r){
        MyStr temp_st;
        strcpy(temp_st.Str,l.Str);
        strcat(temp_st.Str,r.Str);
        return temp_st;
    }
    friend ostream& operator<<(ostream &os, const MyStr &p){
        os<<p.Str;
        return os;
    }
};
int main(){
    MyStr qwe="Param", asd="Qwerty", zxc;
    zxc=qwe+asd;
    cout<<zxc+(asd="123")<<qwe+"!@!&!\n";
    return 0;
}
Я так понимаю наличие friend здесь, образно говоря, позволяет задать два параметра (что должно быть слева и справа от оператора) без него можно, только один оператор (что должно быть справа)...
Насколько я знаю, friend означает, что некое "нечто" (например как в данном случае функции), которое объявлено в текущем классе как друг, может манипулировать частными элементами этого класса, но это имеет смысл, если это нечто не принадлежит этому текущему классу и определено где-то ещё... Так вот, какое тогда значение и смысл несёт friend в данном случае?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2013, 02:32
Ответы с готовыми решениями:

Что означает %k в данном случае?
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void main() { int i,j,k;...

Как работают вложенные структуры? Что это означает в данном случае?
Вот, собственно, часть кода: ... //--type for string--// struct str { char A; int...

Что означает в данном случае символ "&"?
Объясните, пожалуйста, что значит символ &amp; в данной строке: boll MyFunction(string MyVar, MyArr&amp;...

Что означает & в моём случае
Доброго утра/дня/вечера/ночи Учусь работать с памятью и попутно с Cheat Engine Имеется пример:...

10
Don't worry, be happy
17208 / 10085 / 1946
Регистрация: 27.09.2012
Сообщений: 25,164
Записей в блоге: 1
16.12.2013, 02:34 2
Цитата Сообщение от Darthriddikc Посмотреть сообщение
если это нечто не принадлежит этому текущему классу и определено где-то ещё... Так вот, какое тогда значение и смысл несёт friend в данном случае?
тот же самый.
1
Don't worry, be happy
17208 / 10085 / 1946
Регистрация: 27.09.2012
Сообщений: 25,164
Записей в блоге: 1
16.12.2013, 02:42 3
из Стандарта:
Цитата Сообщение от С++11 11.3.6
Что в данном случае означает friend?
2
11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
16.12.2013, 03:07  [ТС] 4
Croessmah, то есть, если функцию, полностью, определить с friend внутри этого же класса, то она не будет считаться его собственной?
0
Комп_Оратор)
Эксперт по математике/физике
8720 / 4431 / 598
Регистрация: 04.12.2011
Сообщений: 13,300
Записей в блоге: 16
16.12.2013, 03:08 5
Цитата Сообщение от Darthriddikc Посмотреть сообщение
Так вот, какое тогда значение и смысл несёт friend в данном случае?
В данном случае принципиально то, что операторная функция-член всегда получает this и он интерпретируется как указатель на левый операнд. То есть оператор-член объявляет один параметр, через который передаётся правый операнд. Фактически он вызывается для левого операнда, так как обычный метод через экземпляр, но вместо оператора доступа служит сам знак оператора.
friend имея доступ к private членам, указателя this не получает. Поэтому левый и правый операнды объявляются оба как параметры. Вызывается он самостоятельно и операнды равноправны.
Цитата Сообщение от Darthriddikc Посмотреть сообщение
то она не будет считаться его собственной?
не будет.
1
3452 / 2802 / 766
Регистрация: 25.03.2012
Сообщений: 10,227
Записей в блоге: 1
16.12.2013, 03:43 6
Не надо отвлекаться на то, какие операнды! Вопрос был про friend!
Это слово обозначает лишь то, что сторонняя функция имеет доступ к приватным членам класса!
Всё!
Например, если бы в классе все члены были б публичными, можно было б вообще не упоминать об операторах внутри класса!
Написать их отдельно в сторонке, как самостоятельные функции!
1
11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
16.12.2013, 03:54  [ТС] 7
IGPIGP, спасибо, думаю, теперь понял
Если я правильно понял, то это так сделано, в конечном итоге, только для того, чтоб указать, что должно быть слева от оператора, ну в случае перегрузки оператора<<, для вывода, это оправдано, так как слева не должно быть экземпляра класса, но с оператором + там так и так получается, что слева будет экземпляр класса, а значит, что там можно обойтись без friend и просто в нужных местах вместо l.Str поставить this->Str однако в аналогичных примерах часто видел, что делали через friend
0
Комп_Оратор)
Эксперт по математике/физике
8720 / 4431 / 598
Регистрация: 04.12.2011
Сообщений: 13,300
Записей в блоге: 16
16.12.2013, 04:11 8
Цитата Сообщение от Darthriddikc Посмотреть сообщение
однако в аналогичных примерах часто видел, что делали через friend
Если сложение экземпляра с другим типом (int например) имеет смысл, то оператором-членом вы сможете сложить объект и int. Но если Вы хотите свободы)), то есть чтобы int мог быть и слева от + а объект класса справа, то без friend тоже не обойтись. То есть, тогда нужно перегрузить и такой вариант.
Kuzia domovenok, думаю именно для операторных функций есть, как раз нюансы. Тут легче объяснить зачем.
1
11 / 11 / 2
Регистрация: 23.12.2012
Сообщений: 45
16.12.2013, 04:23  [ТС] 9
IGPIGP, Кстати да, полностью согласен, Вы правы
0
Эксперт С++
177 / 163 / 21
Регистрация: 12.02.2013
Сообщений: 410
16.12.2013, 10:38 10
Darthriddikc, с friend, вроде бы разобрались. Не знаю, будет ли полезна дополнительная инфа: в таких случаях friend - не панацея. Дело в том, что объявление функции с модификатором friend целесообразно только если соответствующий доступ к участвующим в выполнении перегружаемой операции закрытым членам класса нетривиален. Ежели класс предоставляет набор тривиальных get-функций, то лучше через них реализовать оператор. Например, класс комплексного числа: тут, очевидно, совершенно не нужно использовать friend при наличие встраиваемых get-функций. Это уже относится больше к вопросам проектирования=)
0
Don't worry, be happy
17208 / 10085 / 1946
Регистрация: 27.09.2012
Сообщений: 25,164
Записей в блоге: 1
16.12.2013, 20:45 11
Цитата Сообщение от ITcrusader Посмотреть сообщение
Дело в том, что объявление функции с модификатором friend целесообразно только если соответствующий доступ к участвующим в выполнении перегружаемой операции закрытым членам класса нетривиален.
если доступ не тривиален, то использование friend может привести к порождению кучи ошибок, которые дадут о себе знать в самый не подходящий момент.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2013, 20:45

Что означает pos ^= 1 в данном коде?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define FILE_NAME &quot;numbers.txt&quot; int...

Что означает символ t в данном вариативном шаблоне?
Полный код: #include &lt;iostream&gt; template &lt;typename T&gt; struct NameOf {}; #define...

что означает %k в данном случае?
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void main() { int i,j,k;...

Что означает this в данном контексте?
Привет дорогие киберфорумцы. Нашел код который меня поверг в замешательство. Вот от окаянный: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.