Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
16.12.2013, 02:32     Что в данном случае означает friend? #1
Всем доброй ночи!

Не по теме:

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


Практически всегда вижу, что бинарные операторы обычно перегружают с использованием 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 в данном случае?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2013, 02:32     Что в данном случае означает friend?
Посмотрите здесь:

C++ как передать структуру в функцию, чтобы после выполнения функции он(массив в данном случае) вернулся измененным?
C++ как работают вложенные структуры. что это означает в данном случае?
C++ Friend что то не френдится
что означает pos ^= 1 в данном коде? C++
C++ Пожалуйста объясните в чем состоит перегрузка операторов данном случае?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
16.12.2013, 02:34     Что в данном случае означает friend? #2
Цитата Сообщение от Darthriddikc Посмотреть сообщение
если это нечто не принадлежит этому текущему классу и определено где-то ещё... Так вот, какое тогда значение и смысл несёт friend в данном случае?
тот же самый.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
16.12.2013, 02:42     Что в данном случае означает friend? #3
из Стандарта:
Цитата Сообщение от С++11 11.3.6
Что в данном случае означает friend?
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
16.12.2013, 03:07  [ТС]     Что в данном случае означает friend? #4
Croessmah, то есть, если функцию, полностью, определить с friend внутри этого же класса, то она не будет считаться его собственной?
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
16.12.2013, 03:08     Что в данном случае означает friend? #5
Цитата Сообщение от Darthriddikc Посмотреть сообщение
Так вот, какое тогда значение и смысл несёт friend в данном случае?
В данном случае принципиально то, что операторная функция-член всегда получает this и он интерпретируется как указатель на левый операнд. То есть оператор-член объявляет один параметр, через который передаётся правый операнд. Фактически он вызывается для левого операнда, так как обычный метод через экземпляр, но вместо оператора доступа служит сам знак оператора.
friend имея доступ к private членам, указателя this не получает. Поэтому левый и правый операнды объявляются оба как параметры. Вызывается он самостоятельно и операнды равноправны.
Цитата Сообщение от Darthriddikc Посмотреть сообщение
то она не будет считаться его собственной?
не будет.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.12.2013, 03:43     Что в данном случае означает friend? #6
Не надо отвлекаться на то, какие операнды! Вопрос был про friend!
Это слово обозначает лишь то, что сторонняя функция имеет доступ к приватным членам класса!
Всё!
Например, если бы в классе все члены были б публичными, можно было б вообще не упоминать об операторах внутри класса!
Написать их отдельно в сторонке, как самостоятельные функции!
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
16.12.2013, 03:54  [ТС]     Что в данном случае означает friend? #7
IGPIGP, спасибо, думаю, теперь понял
Если я правильно понял, то это так сделано, в конечном итоге, только для того, чтоб указать, что должно быть слева от оператора, ну в случае перегрузки оператора<<, для вывода, это оправдано, так как слева не должно быть экземпляра класса, но с оператором + там так и так получается, что слева будет экземпляр класса, а значит, что там можно обойтись без friend и просто в нужных местах вместо l.Str поставить this->Str однако в аналогичных примерах часто видел, что делали через friend
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
16.12.2013, 04:11     Что в данном случае означает friend? #8
Цитата Сообщение от Darthriddikc Посмотреть сообщение
однако в аналогичных примерах часто видел, что делали через friend
Если сложение экземпляра с другим типом (int например) имеет смысл, то оператором-членом вы сможете сложить объект и int. Но если Вы хотите свободы)), то есть чтобы int мог быть и слева от + а объект класса справа, то без friend тоже не обойтись. То есть, тогда нужно перегрузить и такой вариант.
Kuzia domovenok, думаю именно для операторных функций есть, как раз нюансы. Тут легче объяснить зачем.
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
16.12.2013, 04:23  [ТС]     Что в данном случае означает friend? #9
IGPIGP, Кстати да, полностью согласен, Вы правы
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
16.12.2013, 10:38     Что в данном случае означает friend? #10
Darthriddikc, с friend, вроде бы разобрались. Не знаю, будет ли полезна дополнительная инфа: в таких случаях friend - не панацея. Дело в том, что объявление функции с модификатором friend целесообразно только если соответствующий доступ к участвующим в выполнении перегружаемой операции закрытым членам класса нетривиален. Ежели класс предоставляет набор тривиальных get-функций, то лучше через них реализовать оператор. Например, класс комплексного числа: тут, очевидно, совершенно не нужно использовать friend при наличие встраиваемых get-функций. Это уже относится больше к вопросам проектирования=)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2013, 20:45     Что в данном случае означает friend?
Еще ссылки по теме:

Объясните, как в данном примере работает friend C++
Что за static friend конструкция? C++
Как правильно вызвать конструктор вектора в данном случае? C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11838 / 6817 / 771
Регистрация: 27.09.2012
Сообщений: 16,909
Записей в блоге: 2
Завершенные тесты: 1
16.12.2013, 20:45     Что в данном случае означает friend? #11
Цитата Сообщение от ITcrusader Посмотреть сообщение
Дело в том, что объявление функции с модификатором friend целесообразно только если соответствующий доступ к участвующим в выполнении перегружаемой операции закрытым членам класса нетривиален.
если доступ не тривиален, то использование friend может привести к порождению кучи ошибок, которые дадут о себе знать в самый не подходящий момент.
Yandex
Объявления
16.12.2013, 20:45     Что в данном случае означает friend?
Ответ Создать тему
Опции темы

Текущее время: 15:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru