Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Nikcharn
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
#1

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

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

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

Вопрос:
Объясните, как в этом примере работает friend. Что он делает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2013, 02:18
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Объясните, как в данном примере работает friend (C++):

Объясните на данном примере как работать с композицией
Не могу понять как работать с композицией. А именно вывод интересует. Что я...

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

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

Объясните использование "double" в данном примере
#include <stdio.h> #include <math.h> int main(void) { int a,b,c; ...

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

Найти ошибку в данном примере
#include <math.h> #include <iostream> using namespace std; int main()...

11
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
20.11.2013, 02:31 #2
Цитата Сообщение от Nikcharn Посмотреть сообщение
Объясните, как в этом примере работает friend. Что он делает.
friend - ключевое слово в объявлении, которое предоставляет объявляемому методу доступ к полям и методам экземпляра. При этом метод не становится методом экземпляра, то есть указатель this ему не передаётся и нужное для сравнение поле нужно передать в виде отдельного параметра. Поэтому их два.
Если объявлять оператор сравнения без него, то то это будет метод экземпляра и доступ к полу firstStr у него будет непосредственно, поэтому передать нужно только вторую строку.
1
Nikcharn
71 / 53 / 10
Регистрация: 31.07.2009
Сообщений: 149
20.11.2013, 02:36  [ТС] #3
Цитата Сообщение от IGPIGP Посмотреть сообщение
friend - ключевое слово в объявлении, которое предоставляет объявляемому методу доступ к полям и методам экземпляра. При этом метод не становится методом экземпляра, то есть указатель this ему не передаётся и нужное для сравнение поле нужно передать в виде отдельного параметра. Поэтому их два.
Если объявлять оператор сравнения без него, то то это будет метод экземпляра и доступ к полу firstStr у него будет непосредственно, поэтому передать нужно только вторую строку.
C++
1
bool operator == (const String& other) const;
То есть можно просто перегрузить оператор следующим способом, и сравнивать this(текущий экземпляр) с other?
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
20.11.2013, 02:41 #4
Цитата Сообщение от Nikcharn Посмотреть сообщение
То есть можно просто перегрузить оператор следующим способом, и сравнивать this(текущий экземпляр) с other?
Можно. Вы сами выбираете критерии сравнения. Обычно проверяют на равенство все поля-значения и значения по указателям, поэтому принимает такой оператор аж целый экземпляр.
Но если в экземпляре кроме строки ничего нет или остальное для данного алгоритма несущественно то можно принимать тот тип который сочтёте нужным сравнивать.
1
Kuzia domovenok
2216 / 1985 / 447
Регистрация: 25.03.2012
Сообщений: 6,978
Записей в блоге: 1
20.11.2013, 03:07 #5
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
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
20.11.2013, 03:27 #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Перегружаемый оператор не обязательно должен быть дружественным
Да, поймался я. Некоторые операторы вроде присваивания и сравнения могут быть только членами.
friends для операторов это в основном для размещения оператора справа от объекта. Вроде операторов ввода или вывода в поток или арифметических вроде оператора сложения.
Nikcharn, а зачем может понадобиться оператор сравнения допускающий такое размещение? Чтобы писать:
if(0 == obj)
не допуская возможности ошибки вроде
if(obj = 0)
этого хотелось?
0
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.11.2013, 10:53 #7
Цитата Сообщение от IGPIGP Посмотреть сообщение
Некоторые операторы вроде присваивания и сравнения могут быть только членами.
Присваивания - да, сравнения - нет.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
20.11.2013, 13:59 #8
Цитата Сообщение от 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
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2013, 14:07 #9
Цитата Сообщение от 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
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
20.11.2013, 14:33 #10
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
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
20.11.2013, 14:42 #11
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это интересный пример того когда true == 0 и false != 0
Тут несколько иная ситуация, т.к. strcmp возвращает по сути 3 значения: больше, меньше, равно. Но подсознательно, используя ее для сравнения, ожидаешь ненулевое значение при равенстве строк.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7009 / 3302 / 451
Регистрация: 04.12.2011
Сообщений: 9,141
Записей в блоге: 5
20.11.2013, 15:12 #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Тут несколько иная ситуация, т.к. strcmp возвращает по сути 3 значения: больше, меньше, равно.
Конечно. Но в принципе при написании своего сравнителя или метода в парсинге например, может оказаться удобным возможность вернуть 0 когда результат ожидаем и иметь кучу вариантов возврата для для разных не ожидаемых.
Цитата Сообщение от Tulosba Посмотреть сообщение
используя ее для сравнения, ожидаешь ненулевое значение при равенстве строк.
Вот-вот, - инерция мысли.
1
20.11.2013, 15:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2013, 15:12
Привет! Вот еще темы с решениями:

Почему ответ равен 0 в данном примере: 3/4*6!?
Почему ответ равен 0 в данном примере: 3/4*6!?

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

как работает #define в примере ?
Почему пезультат 2? #include &lt;iostream&gt; using namespace std; ...

Не могли бы вы объяснить простыми словами что делают функции calloc в данном примере
Не могли бы вы объяснить простыми словами что делают функции calloc в данном...


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

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

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