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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.65
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
#1

Дружественные функции - C++

29.09.2010, 15:05. Просмотров 2152. Ответов 8
Метки нет (Все метки)

День добрый.
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
class Distance
{
private:
    int fut;
    int inch;
public:
    Distance():fut(0),inch(0){};
    Distance(int f,int i):fut(f),inch(i){};
    Distance(float f)
    {
        fut=static_cast<int>(f);
        inch=int((f-fut)*12);
    }
    void print()
    {
        cout << "Футы: " << fut << "  дюймы: " << inch << endl;
    }
    friend Distance operator*(Distance d1,Distance d2) // Дружественная фунция
    {
        int i=(d1.fut*12+d1.inch)*(d2.fut*12+d2.inch);
        int f=0;
        while(i>=144)
        {
            i-=144;
            f++;
        }
        return Distance(f,i);
    }
};
У меня такой вопрос: к чему дружественный перегруженый оператор '*'?
Понимаю когда дружественная функция в 2-х классах.... а тут чет как то не могу понять...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2010, 15:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дружественные функции (C++):

Дружественные функции. Наследование. Перегрузка функции - C++
Здравствуйте, у меня проблема Не знаю куда Вставить имеющийся код(В какую строчку или строчки кода). Первый код это было 1 задание, 2-ой...

Дружественные функции - C++
Напишите программу, вычеркивающую из данного слова все буквы «а» (так, чтобы, например, из слова «заноза» получилось «зноз»), через...

дружественные функции - C++
Тема: дружественные функции Напишите программу обращения слова. Помогите решить на С++

дружественные функции - C++
Имеется следующий код, содержащий дружественную функцию: mt.h #ifndef MT_H_ #define MT_H_ class Time { private: int...

Дружественные функции - C++
Всем привет,объясните пожалуйста,почему мой код не выводит информацию из private, даже если я указал как friend нужную функцию(наверное)....

Дружественные функции - C++
Написал програмку по Лафоре. Однако на объявлении дружественной ф-и происходит ошибка компиляции. Может кто знает в чем может быть...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 243
29.09.2010, 15:37 #2
А еще код программы.
Где-то там будет что-то типа
C++
1
2
3
Distance *dlin;
dlin=new Distance(x,y);
dlindlin=*dlin;
и вместо этого *dlin; выполнятся тело дружественной функции
Только не понятно зачем здесь дружественная функция, если она является функцией класса.
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
29.09.2010, 15:44  [ТС] #3
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    setlocale(LC_ALL,"Russian");
    Distance d1(12.24F);
    Distance d2(14.87F);
    Distance d3;
    d3=12.45F*d1; //Собсна для этого нужна дружественная функция, что бы перегрузить число*класс
    d3.print();
    return EXIT_SUCCESS;
}
Без использования d3=12.45F*d1; можно просто перегрузить оператор
Вот я и не очень пойму что меняет дружественная функция
0
Vergil
42 / 36 / 14
Регистрация: 11.11.2009
Сообщений: 243
29.09.2010, 16:06 #4
Здесь, по-моему, ничего.
С тем же успехом можно было написать
C++
1
Distance operator*(Distance d1,Distance d2) // предательски-недружественная функция
Дружественные функции не являются элементами класса, но спецификатор friend отменяет действие спецификаторов private и protected.
А здесь она является элементом-функцией класса. Попробуй удалить friend; Усли все нормально будет, то забудь. Если нет, пиши еще подумаем.
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
29.09.2010, 16:15  [ТС] #5
а в том то и дело чтго без ключевого friend оно то не работает

Добавлено через 2 минуты
я отдаленно догадываюсь, что при написании типа d3=12.45F*d1, число float преобразуется конструктором в тип Distance и что бы их умножить и нужна дружественная функции, т.к. каждый экземпляр класса не связан друг с другом
0
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
29.09.2010, 16:23 #6
Цитата Сообщение от LineStown Посмотреть сообщение
У меня такой вопрос: к чему дружественный перегруженый оператор '*'?
Понимаю когда дружественная функция в 2-х классах.... а тут чет как то не могу понять...
потому что дружественная функция дает возможность в качестве аргументов передавать 2 разных объекта одного и того же класса, что видно из вашего кода:

Цитата Сообщение от LineStown Посмотреть сообщение
C++
1
friend Distance operator*(Distance d1,Distance d2) // Дружественная фунция
Добавлено через 4 минуты
попробуйте перегрузить просто оператор * и поставить в качестве аргумента 2 объекта класса, компилятор начнет ругаться и говорить что перегрузка оператора * может принимать только 1 аргумент

Добавлено через 1 минуту
Цитата Сообщение от LineStown Посмотреть сообщение
12.45F
первый раз вижу чтоб так описывали число флоат)
1
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
29.09.2010, 16:33  [ТС] #7
Цитата Сообщение от Crudelis Посмотреть сообщение
попробуйте перегрузить просто оператор * и поставить в качестве аргумента 2 объекта класса, компилятор начнет ругаться и говорить что перегрузка оператора * может принимать только 1 аргумент
Ну если суть только в возможно использовать более одного аргумента, то понятно.....

Цитата Сообщение от Crudelis Посмотреть сообщение
первый раз вижу чтоб так описывали число флоат)
ммм а есть другой способ? я как то где то прочитал что 12.45F 11.55D float и double соответственно
0
Crudelis
Шаровик затейник
674 / 416 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
29.09.2010, 16:47 #8
Цитата Сообщение от LineStown Посмотреть сообщение
Ну если суть только в возможно использовать более одного аргумента, то понятно.....
дружественная функция получает прямой доступ к полям класса, применяется не только для перегрузки операторов но и в других случаях где нужно работать с объектом одного/двумя классов, попробуй перегрузить оператор + и попробовать сложить ob+3, ошибки не будет, а вот если попробуешь сложить 3+ob здесь уже ошибка, которую можно решить с помощью дружественной функции.
C++
1
2
3
4
5
6
7
Distance operator+(int t)
{
Distance temp;
temp.fut=fut+t;
temp.inch=inch+t;
return temp;
}
В данном вопросе поможет друж функция
C++
1
2
3
4
5
6
7
freind Distance operator+(int t, Distance ob)
{
Distance temp;
temp.fut=ob.fut+t;
temp.inch=ob.inch+t;
return temp;
}
Добавлено через 57 секунд
Цитата Сообщение от LineStown Посмотреть сообщение
ммм а есть другой способ
другой способ в описании переменной это обозначить int a; float b; double c;
1
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
29.09.2010, 16:50  [ТС] #9
Цитата Сообщение от Crudelis Посмотреть сообщение
другой способ в описании переменной это обозначить int a; float b; double c;
Ну так это при необходимости использовать переменные, а не просто число ....

Добавлено через 47 секунд
А так спасибо за обьяснение, в принципе понял, но надо практиковаться для уверенности
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2010, 16:50
Привет! Вот еще темы с ответами:

дружественные функции - C++
Всем привет!!! Есть код: #include&lt;iostream.h&gt; #include&lt;conio.h&gt; #include&lt;string.h&gt; enum...

Дружественные функции - C++
С дружественными классами разобрался, спасибо. А теперь ф-ции. Киньте пожалуста простой пример: класс(несколько полей), обьект описаный в...

Дружественные функции - C++
Тут выдает ошибку Помогите Ошибка 3 error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает...

Дружественные функции - C++
Создать класс «студент» (его фамилия, имя, год рождения и год поступления). Написать: а) член-функцию печати информации о студенте; ...


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

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

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