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

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

Войти
Регистрация
Восстановить пароль
 
Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
#1

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

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

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

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

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
20.11.2013, 02:31 #2
Цитата Сообщение от Nikcharn Посмотреть сообщение
Объясните, как в этом примере работает friend. Что он делает.
friend - ключевое слово в объявлении, которое предоставляет объявляемому методу доступ к полям и методам экземпляра. При этом метод не становится методом экземпляра, то есть указатель this ему не передаётся и нужное для сравнение поле нужно передать в виде отдельного параметра. Поэтому их два.
Если объявлять оператор сравнения без него, то то это будет метод экземпляра и доступ к полу firstStr у него будет непосредственно, поэтому передать нужно только вторую строку.
Nikcharn
71 / 53 / 3
Регистрация: 31.07.2009
Сообщений: 149
20.11.2013, 02:36  [ТС] #3
Цитата Сообщение от IGPIGP Посмотреть сообщение
friend - ключевое слово в объявлении, которое предоставляет объявляемому методу доступ к полям и методам экземпляра. При этом метод не становится методом экземпляра, то есть указатель this ему не передаётся и нужное для сравнение поле нужно передать в виде отдельного параметра. Поэтому их два.
Если объявлять оператор сравнения без него, то то это будет метод экземпляра и доступ к полу firstStr у него будет непосредственно, поэтому передать нужно только вторую строку.
C++
1
bool operator == (const String& other) const;
То есть можно просто перегрузить оператор следующим способом, и сравнивать this(текущий экземпляр) с other?
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
20.11.2013, 02:41 #4
Цитата Сообщение от Nikcharn Посмотреть сообщение
То есть можно просто перегрузить оператор следующим способом, и сравнивать this(текущий экземпляр) с other?
Можно. Вы сами выбираете критерии сравнения. Обычно проверяют на равенство все поля-значения и значения по указателям, поэтому принимает такой оператор аж целый экземпляр.
Но если в экземпляре кроме строки ничего нет или остальное для данного алгоритма несущественно то можно принимать тот тип который сочтёте нужным сравнивать.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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;
}
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
20.11.2013, 03:27 #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Перегружаемый оператор не обязательно должен быть дружественным
Да, поймался я. Некоторые операторы вроде присваивания и сравнения могут быть только членами.
friends для операторов это в основном для размещения оператора справа от объекта. Вроде операторов ввода или вывода в поток или арифметических вроде оператора сложения.
Nikcharn, а зачем может понадобиться оператор сравнения допускающий такое размещение? Чтобы писать:
if(0 == obj)
не допуская возможности ошибки вроде
if(obj = 0)
этого хотелось?
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.11.2013, 10:53 #7
Цитата Сообщение от IGPIGP Посмотреть сообщение
Некоторые операторы вроде присваивания и сравнения могут быть только членами.
Присваивания - да, сравнения - нет.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
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;
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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);
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
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 конечно

Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.11.2013, 14:42 #11
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это интересный пример того когда true == 0 и false != 0
Тут несколько иная ситуация, т.к. strcmp возвращает по сути 3 значения: больше, меньше, равно. Но подсознательно, используя ее для сравнения, ожидаешь ненулевое значение при равенстве строк.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
20.11.2013, 15:12 #12
Цитата Сообщение от Tulosba Посмотреть сообщение
Тут несколько иная ситуация, т.к. strcmp возвращает по сути 3 значения: больше, меньше, равно.
Конечно. Но в принципе при написании своего сравнителя или метода в парсинге например, может оказаться удобным возможность вернуть 0 когда результат ожидаем и иметь кучу вариантов возврата для для разных не ожидаемых.
Цитата Сообщение от Tulosba Посмотреть сообщение
используя ее для сравнения, ожидаешь ненулевое значение при равенстве строк.
Вот-вот, - инерция мысли.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2013, 15:12
Привет! Вот еще темы с ответами:

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

как работает #define в примере ? - C++
Почему пезультат 2? #include &lt;iostream&gt; using namespace std; #define A 0 #define B A+1

Не могли бы вы объяснить простыми словами что делают функции calloc в данном примере - C++
Не могли бы вы объяснить простыми словами что делают функции calloc в данном примере? struct graph_v//структура вершины графа { ...

Не работает friend - C++
#ifndef INTEGERLONGS_HPP_INCLUDED #define INTEGERLONGS_HPP_INCLUDED...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.11.2013, 15:12
Ответ Создать тему
Опции темы

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