С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
#1

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

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

Что означает %k в данном случае? - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; void main() { int i,j,k; cout&lt;&lt;&quot;razmer massiva:&quot;&lt;&lt;endl; cin&gt;&gt;k; ...

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

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

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

Объясните, как в данном примере работает friend - C++
friend bool operator== (const String&amp; firstStr, const String&amp; secondStr); Если писать код без friend, то возникает ошибка: ...

Что означает int pos = 0; int value = 5; в данном коде? - C++
#include&lt;conio.h&gt; #include&lt;stdio.h&gt; #include&lt;math.h&gt; void mass(int y); void main() { int y;

10
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
16.12.2013, 02:34 #2
Цитата Сообщение от Darthriddikc Посмотреть сообщение
если это нечто не принадлежит этому текущему классу и определено где-то ещё... Так вот, какое тогда значение и смысл несёт friend в данном случае?
тот же самый.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
16.12.2013, 02:42 #3
из Стандарта:
Цитата Сообщение от С++11 11.3.6
Что в данном случае означает friend?
2
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
16.12.2013, 03:07  [ТС] #4
Croessmah, то есть, если функцию, полностью, определить с friend внутри этого же класса, то она не будет считаться его собственной?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6519 / 3156 / 309
Регистрация: 04.12.2011
Сообщений: 8,726
Записей в блоге: 5
16.12.2013, 03:08 #5
Цитата Сообщение от Darthriddikc Посмотреть сообщение
Так вот, какое тогда значение и смысл несёт friend в данном случае?
В данном случае принципиально то, что операторная функция-член всегда получает this и он интерпретируется как указатель на левый операнд. То есть оператор-член объявляет один параметр, через который передаётся правый операнд. Фактически он вызывается для левого операнда, так как обычный метод через экземпляр, но вместо оператора доступа служит сам знак оператора.
friend имея доступ к private членам, указателя this не получает. Поэтому левый и правый операнды объявляются оба как параметры. Вызывается он самостоятельно и операнды равноправны.
Цитата Сообщение от Darthriddikc Посмотреть сообщение
то она не будет считаться его собственной?
не будет.
1
Kuzia domovenok
2078 / 1907 / 176
Регистрация: 25.03.2012
Сообщений: 6,572
Записей в блоге: 1
16.12.2013, 03:43 #6
Не надо отвлекаться на то, какие операнды! Вопрос был про friend!
Это слово обозначает лишь то, что сторонняя функция имеет доступ к приватным членам класса!
Всё!
Например, если бы в классе все члены были б публичными, можно было б вообще не упоминать об операторах внутри класса!
Написать их отдельно в сторонке, как самостоятельные функции!
1
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
16.12.2013, 03:54  [ТС] #7
IGPIGP, спасибо, думаю, теперь понял
Если я правильно понял, то это так сделано, в конечном итоге, только для того, чтоб указать, что должно быть слева от оператора, ну в случае перегрузки оператора<<, для вывода, это оправдано, так как слева не должно быть экземпляра класса, но с оператором + там так и так получается, что слева будет экземпляр класса, а значит, что там можно обойтись без friend и просто в нужных местах вместо l.Str поставить this->Str однако в аналогичных примерах часто видел, что делали через friend
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6519 / 3156 / 309
Регистрация: 04.12.2011
Сообщений: 8,726
Записей в блоге: 5
16.12.2013, 04:11 #8
Цитата Сообщение от Darthriddikc Посмотреть сообщение
однако в аналогичных примерах часто видел, что делали через friend
Если сложение экземпляра с другим типом (int например) имеет смысл, то оператором-членом вы сможете сложить объект и int. Но если Вы хотите свободы)), то есть чтобы int мог быть и слева от + а объект класса справа, то без friend тоже не обойтись. То есть, тогда нужно перегрузить и такой вариант.
Kuzia domovenok, думаю именно для операторных функций есть, как раз нюансы. Тут легче объяснить зачем.
1
Darthriddikc
10 / 10 / 0
Регистрация: 23.12.2012
Сообщений: 45
16.12.2013, 04:23  [ТС] #9
IGPIGP, Кстати да, полностью согласен, Вы правы
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
16.12.2013, 10:38 #10
Darthriddikc, с friend, вроде бы разобрались. Не знаю, будет ли полезна дополнительная инфа: в таких случаях friend - не панацея. Дело в том, что объявление функции с модификатором friend целесообразно только если соответствующий доступ к участвующим в выполнении перегружаемой операции закрытым членам класса нетривиален. Ежели класс предоставляет набор тривиальных get-функций, то лучше через них реализовать оператор. Например, класс комплексного числа: тут, очевидно, совершенно не нужно использовать friend при наличие встраиваемых get-функций. Это уже относится больше к вопросам проектирования=)
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
16.12.2013, 20:45 #11
Цитата Сообщение от ITcrusader Посмотреть сообщение
Дело в том, что объявление функции с модификатором friend целесообразно только если соответствующий доступ к участвующим в выполнении перегружаемой операции закрытым членам класса нетривиален.
если доступ не тривиален, то использование friend может привести к порождению кучи ошибок, которые дадут о себе знать в самый не подходящий момент.
1
16.12.2013, 20:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2013, 20:45
Привет! Вот еще темы с ответами:

Для чего выполняется присваивание в данном случае? - C++
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; int main() { long n, k1=1, k2=1; double dbln, term, sum=0; ...

Как правильно вызвать конструктор вектора в данном случае? - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;map&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; typedef...

Пожалуйста объясните в чем состоит перегрузка операторов данном случае? - C++
// Complex.cpp: главный файл проекта. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; ...

Перегрузка операторов, friend или нет friend? - C++
Всем здравствуйте. Есть такой вопрос: при перегрузке операторов в классе(пусть будут + и = (вообще неважно, за исключением потока)) как и...


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

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

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