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

Перегрузка операций - C++

Восстановить пароль Регистрация
 
Nishen
 Аватар для Nishen
171 / 77 / 28
Регистрация: 26.02.2015
Сообщений: 453
15.07.2015, 15:23     Перегрузка операций #1
Цитата из Р. Лафоре "Объекто-ориентированное программирование в C++":
Объект, стоящий с левой стороны операции ... вызывает функцию оператора. Объект, стоящий справа от знака операции, должен быть передан в функцию в качестве аргумента.
Далее идет пример:
Кликните здесь для просмотра всего текста
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
#include <iostream>
using namespace std;
//---------------------------------------------------------------------------//
//Определение класса Distance
//---------------------------------------------------------------------------//
class Distance{
    private:
        const float MTF;
        int feet;
        float inches;
    public:
        Distance() : feet(0), inches(0.0), MTF(3.280833F)
        {}
        Distance(float meters) : MTF(3.280833F){
            float fltfeet = MTF * meters;
            feet = static_cast<int>(fltfeet);
            inches = 12 * (fltfeet - feet);
        }
        Distance(int ft, float in) : feet(ft), inches(in), MTF(3.280833F)
        {}
        void getDist(){
            cout << "\nВведите футы: "; cin >> feet;
            cout << "Введите дюймы: "; cin >> inches;
        }
        void showDist() const{
            cout << feet << "\'-" << inches << '\"';
        }
        operator float() const{
            float fracfeet = inches / 12;
            fracfeet += static_cast<float>(feet);
            return fracfeet / MTF;
        }
};
//-----------------------------------------------------------------------------
int main(){
    setlocale(LC_ALL, "Russian");
    float mtrs;
    Distance dist1 = 2.35F;
    cout << "\ndist1 = "; dist1.showDist();
 
    mtrs = static_cast<float>(dist1);
    
    cout << "\ndist1 = " << mtrs << " meters\n";
 
    Distance dist2(5, 10.25);
 
    mtrs = dist2;
    cout << "\ndist2 = " << mtrs << " meters\n";
 
    system("PAUSE");
    return 0;
}


Собственно, вопрос заключается в следующем. В данном примере есть строка
C++
1
mtrs = dist2;
Что в этой строке вызывает функцию оператора перевода в тип float? Знак равно или переменная mtrs?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2015, 15:23     Перегрузка операций
Посмотрите здесь:

C++ перегрузка операций С++
C++ Перегрузка операций << и >>
перегрузка операций C++
C++ перегрузка операций
Перегрузка операций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.07.2015, 15:26     Перегрузка операций #2
Идет неявная конвертация во float, т.к. идет присваивание значению типа float.
Nishen
 Аватар для Nishen
171 / 77 / 28
Регистрация: 26.02.2015
Сообщений: 453
15.07.2015, 15:29  [ТС]     Перегрузка операций #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Идет неявная конвертация во float, т.к. идет присваивание значению типа float.
Это мне ясно, но что вызвало метод преобразования из класса? Метод вызывал сам объект dist2, так?
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,575
15.07.2015, 15:44     Перегрузка операций #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Nishen Посмотреть сообщение
но что вызвало метод преобразования из класса?
Преобразование и вызвало.

В С++ вообще много какие выражения могут приводить к вызову операторных функций.
Например, при перегрузке оператора * для класса А, и написании в коде
C++
1
2
A a, b;
A c = a * b;
мы получим вызов оператора *. Но явно вызова в коде нигде нет. Выражение a * b означает следующее:
C++
1
A c = operator*(a, b); // или a.operator*(b);
Тут такая же картина. Выражение
C++
1
mtrs = dist2;
потребовало преобразования типов. Компилятор поискал среди доступных для этого класса возможных преобразований и нашел твой оператор float. Он подошел больше других (т.к. он единственный), его и вызвали. Т.е. по сути этот код превратился вот в такое:
C++
1
mtrs = dist2.operator float();
т.е. в обычный вызов функции класса, такая запись тоже будет работать.
Nishen
 Аватар для Nishen
171 / 77 / 28
Регистрация: 26.02.2015
Сообщений: 453
15.07.2015, 15:57  [ТС]     Перегрузка операций #5
Спасибо большое за разъяснения.
Yandex
Объявления
15.07.2015, 15:57     Перегрузка операций
Ответ Создать тему
Опции темы

Текущее время: 01:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru