Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
 Аватар для Nikcharn
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149

Объясните, как в данном примере работает friend

20.11.2013, 02:18. Показов 2207. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
friend bool operator== (const String& firstStr, const String& secondStr);
Если писать код без friend, то возникает ошибка:
слишком много параметров для этой функции оператора.

Вопрос:
Объясните, как в этом примере работает friend. Что он делает.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2013, 02:18
Ответы с готовыми решениями:

Объясните на данном примере как работать с композицией
Не могу понять как работать с композицией. А именно вывод интересует. Что я делаю не так?#include <iostream> using namespace std; ...

Объясните, как в данном примере работают виртуальные функции?
Такое дело надо обьяснить особенность виртуальной функции, типо как будет работать программа без виртуальных функций #include...

Объясните как работает полиморфизм на моем примере
Здравствуйте уважаемые. Пожалуйста объясните на моем примере, как это работает. Выдержки из моего кода. class Instrumenti { ...

11
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.11.2013, 02:31
Цитата Сообщение от Nikcharn Посмотреть сообщение
Объясните, как в этом примере работает friend. Что он делает.
friend - ключевое слово в объявлении, которое предоставляет объявляемому методу доступ к полям и методам экземпляра. При этом метод не становится методом экземпляра, то есть указатель this ему не передаётся и нужное для сравнение поле нужно передать в виде отдельного параметра. Поэтому их два.
Если объявлять оператор сравнения без него, то то это будет метод экземпляра и доступ к полу firstStr у него будет непосредственно, поэтому передать нужно только вторую строку.
1
 Аватар для Nikcharn
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
20.11.2013, 02:36  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
friend - ключевое слово в объявлении, которое предоставляет объявляемому методу доступ к полям и методам экземпляра. При этом метод не становится методом экземпляра, то есть указатель this ему не передаётся и нужное для сравнение поле нужно передать в виде отдельного параметра. Поэтому их два.
Если объявлять оператор сравнения без него, то то это будет метод экземпляра и доступ к полу firstStr у него будет непосредственно, поэтому передать нужно только вторую строку.
C++
1
bool operator == (const String& other) const;
То есть можно просто перегрузить оператор следующим способом, и сравнивать this(текущий экземпляр) с other?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.11.2013, 02:41
Цитата Сообщение от Nikcharn Посмотреть сообщение
То есть можно просто перегрузить оператор следующим способом, и сравнивать this(текущий экземпляр) с other?
Можно. Вы сами выбираете критерии сравнения. Обычно проверяют на равенство все поля-значения и значения по указателям, поэтому принимает такой оператор аж целый экземпляр.
Но если в экземпляре кроме строки ничего нет или остальное для данного алгоритма несущественно то можно принимать тот тип который сочтёте нужным сравнивать.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
20.11.2013, 03:07
Nikcharn, friend даёт доступ другой функции или классу, указанным как дружественные к закрытым членам определяемого класса. Всё!
Дружественные функции не обязательно должны быть операторами
И наоборот:
Перегружаемый оператор не обязательно должен быть дружественным
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
using namespace std;
string operator^(string str, int p){
  string s="";
  for (int i=0; i<p; i++)
     s=s+str;
  return s;
}
int main(){
  string a="alpha";
  string b=a^3;
  cout<<b;
  return 0;
}
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.11.2013, 03:27
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Перегружаемый оператор не обязательно должен быть дружественным
Да, поймался я. Некоторые операторы вроде присваивания и сравнения могут быть только членами.
friends для операторов это в основном для размещения оператора справа от объекта. Вроде операторов ввода или вывода в поток или арифметических вроде оператора сложения.
Nikcharn, а зачем может понадобиться оператор сравнения допускающий такое размещение? Чтобы писать:
if(0 == obj)
не допуская возможности ошибки вроде
if(obj = 0)
этого хотелось?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.11.2013, 10:53
Цитата Сообщение от IGPIGP Посмотреть сообщение
Некоторые операторы вроде присваивания и сравнения могут быть только членами.
Присваивания - да, сравнения - нет.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.11.2013, 13:59
Цитата Сообщение от alsav22 Посмотреть сообщение
Присваивания - да, сравнения - нет.
И это верно. Применение модификатора const для метода не члена приводит к тому, что мой компилятор ругается на знак == для метода не члена:
error C2270: ==: модификаторы недопустимы для функций, не являющихся членами
вот и запутался. Это язык в котором при желании не трудно запутаться.
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
struct A{
    A(int a_, string b_){
a=a_;
b=b_;
    }
int a;
string b;
 
bool operator==(const string rhs)const{
return b == rhs;
}
 
bool operator==(const char *rhs)const{
    if(strcmp(b.c_str(), rhs)==1) return true;
    return false;
}
bool operator==(const int &rhs)const{
    return rhs == a;
}
bool operator==(const A &rhs)const{
    return (rhs.a == a) && (rhs.b == b);
}
 
friend bool operator==(const string &lhs, const A &rhs)/*const*/{//модификатор const для метода не члена неприменим
return lhs == rhs.b ;
}
};
 
void foo_aga(bool is_aga){
if(is_aga) cout<<"AGA!"<<endl;
else cout<<"Ne-a!"<<endl;
cout<<endl;
}
 
int main(){
SetConsoleCP (1251); SetConsoleOutputCP (1251);
string aga="aga";
string ne_aga="ne_aga";
int ugu = 123;
int ne_ugu = 456;
A orig(ugu, aga);
A to_cmp_frst(ugu, aga);
A to_cmp_scnd(ugu, ne_aga);
 
cout<< "orig == to_cmp_frst" << endl;
foo_aga(orig == to_cmp_frst);
 
cout<< "orig == to_cmp_scnd" << endl;
foo_aga(orig == to_cmp_scnd);
 
cout<< "orig == string aga" << endl;
foo_aga(orig == aga);
 
cout<< "string aga == orig" << endl;//
foo_aga(aga == orig);
 
bool (*ptr_compire_str_to_obj)(const string &str, const A &obj);
ptr_compire_str_to_obj = operator==;//это забавно
cout<<endl;
cout<<"ptr_compire_str_to_obj(aga, orig ) =  " << endl;
foo_aga(ptr_compire_str_to_obj(aga, orig));
cout<<endl;
 
system("pause");
return 0;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2013, 14:07
Цитата Сообщение от IGPIGP Посмотреть сообщение
bool operator==(const char *rhs)const{ if(strcmp(b.c_str(), rhs)==1) return true; return false; }
Откуда 1?
A zero value indicates that both strings are equal.
К тому же можно без bool-shit'а:
C++
1
return !strcmp(b.c_str(), rhs);
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.11.2013, 14:33
Tulosba, да по памяти написал и снова, ляп...
Это интересный пример того когда true == 0 и false != 0
так как например для возврата из main.
Вообще логичнее когда при нормальном исходе 0, а при ненормальном - код ошибки, поэтому для сравнителя int было бы самое то. Но соглашение и поддержка уже не в согласии с таким подходом. В том смысле что объявить int можно, но возвращать 0 когда true - попрощаться с алгоритмами.

Не по теме:


Вот эта строчка интересно может быть написана:

C++
1
2
3
bool (*ptr_compire_str_to_obj)(const string &str, const A &obj);
ptr_compire_str_to_obj = operator /*пробелище)))*/
==;//это забавно
Croessmah, значит пробел запрещён не во всех именах? Но тогда не смотря на то, что нельзя:
C++
1
Straus Trup
мoжно хоть иногда и в сочетании с "==", например:
C++
1
(Straus == Trup)? true : false;
моё мнение брехня неправда, что true, - false конечно:)

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2013, 14:42
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это интересный пример того когда true == 0 и false != 0
Тут несколько иная ситуация, т.к. strcmp возвращает по сути 3 значения: больше, меньше, равно. Но подсознательно, используя ее для сравнения, ожидаешь ненулевое значение при равенстве строк.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.11.2013, 15:12
Цитата Сообщение от Tulosba Посмотреть сообщение
Тут несколько иная ситуация, т.к. strcmp возвращает по сути 3 значения: больше, меньше, равно.
Конечно. Но в принципе при написании своего сравнителя или метода в парсинге например, может оказаться удобным возможность вернуть 0 когда результат ожидаем и иметь кучу вариантов возврата для для разных не ожидаемых.
Цитата Сообщение от Tulosba Посмотреть сообщение
используя ее для сравнения, ожидаешь ненулевое значение при равенстве строк.
Вот-вот, - инерция мысли.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2013, 15:12
Помогаю со студенческими работами здесь

Объясните использование "double" в данном примере
#include &lt;stdio.h&gt; #include &lt;math.h&gt; int main(void) { int a,b,c; scanf(&quot;%d %d %d&quot;,&amp;a,&amp;b,&amp;c); // x*x*x +...

Как изменить значение const в данном примере?
Здравствуйте, я пишу свой интерпретатор. Дело в том, что Parser_impl является константой. Как в нести следующий изменения в данный метод:...

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

Найти ошибку в данном примере
#include &lt;math.h&gt; #include &lt;iostream&gt; using namespace std; int main() { int n, a; cin &gt;&gt; n; int sum = 1/a; for (int...

Непонятно функционирование цикла while в данном примере
Всем привет, ребят! Заранее благодарю за помощь. Пример взят из книги Шилдт C++ &quot;Шаг за шагом&quot; и немного модифицирован мной,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru