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

Перегрузка оператора вывода в поток - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Дан список из сведений о багаже 10 пассажиров. http://www.cyberforum.ru/cpp-beginners/thread259550.html
Подскажите пожалуйста как написать функцию ( if ) в данном примере: вот задание: Дан список из сведений о багаже 10 пассажиров. Найти багаж, средний вес одной вещи, в котором отличается не...
C++ За две недели надо написать программу с полным ее описанием по С++ необходимо создать базу данных.с чего бы начать? http://www.cyberforum.ru/cpp-beginners/thread259547.html
C++ Вопрос по указателям
Ребят, простите за такую глупость, но вот не знаю как ответить на чётко поставленный преподавателем вопрос : "Как зная указатель на функцию, получить значение этой функции в точке ?"
C++ Функции на С
Дано действительное число y. Получить
C++ Выражения и файлы http://www.cyberforum.ru/cpp-beginners/thread259487.html
В текстовом файле находится выражение, состоящее из чисел и знаков арифметических операций. Программа вычисляет это выражение, учитывая приоритет операций и скобки. Использовать алгоритм Бауэра и...
C++ Стек В общем это не задача, а так, чисто для себя. В общем, нужно с помощью стека получить слово-перевёртыш. Само слово я могу получить, но как его потом в массив записать. Подскажите пожалуйста.... подробнее

Показать сообщение отдельно
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517

Перегрузка оператора вывода в поток - C++

18.03.2011, 09:39. Просмотров 13197. Ответов 11
Метки (Все метки)

Собственно есть программка (большинство функций выкинул чтобы не запутывали) по работе с дробными числами
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
# include <iostream>
# include <iomanip>
using namespace std;
 
class RationalNumber
{
friend ostream &operator<<(ostream &output, const RationalNumber &abc);
public:
    // констркутор по умолчанию, проверяет что дробная часть >0
    // +проверяет можно ли сократить дробь
    RationalNumber(int a=1, int b=1)
    {
        nominator=(a>0) ? a:1;
        denominator=(b>0)? b:1;
        for (int i=2;i<=nominator;i++)
         if (denominator%i==0 && nominator%i==0 )
         {
             nominator/=i;
             denominator/=i;
         }
 
    }
 
    // возможность сложения двух объектов класса RationalNumber
    RationalNumber operator+(RationalNumber &right)
    {
        if (denominator==right.denominator) //если знаменатели равны
         return RationalNumber(nominator+right.nominator,denominator);
        int temp; //иначе
        temp=denominator*right.denominator; // определяем новый знаменатель
        return RationalNumber(((temp/denominator*nominator)+(temp/right.denominator*right.nominator))
        ,temp);
    }
 
 
private:
    int nominator; // числитель
    int denominator; // знаменатель
};
 
ostream &operator<<(ostream &output, const RationalNumber &abc)
{
    output<<abc.nominator;
        if (abc.denominator>1) //если знаменатель не =1 (число не целое)
     output<<"/"<<abc.denominator<<endl;
     return output;
}
 
 
int main()
{
    RationalNumber a(17,10);
    RationalNumber b(20,10);
    RationalNumber c;
    cout<<"A: "<<a;
    cout<<"B: "<<b<<endl;
    cout<<(c=a+b); // МОЖНО в любом случае
    cout<<(a+b); // НЕЛЬЗЯ если объект в функции вывода не const или же если не передаёться копия объекта
}
Программа работает, но мне стало интересно почему если в перегрузке оператора вывода написать
C++
1
ostream &operator<<(ostream &output, RationalNumber &abc)
вместо
C++
1
ostream &operator<<(ostream &output, const RationalNumber &abc)
то в main уже будет невозможно вывести в поток (a+b), хотя присвоить c и вывести всё равно можно (c=a+b) ? Ведь я ставлю const только для передаваемого функции объекта и это не влияет же никак на возвращаемый результат.
Также можно делать копию объекта при передаче и тогда программа тоже будет компилироваться
C++
1
ostream &operator<<(ostream &output, RationalNumber abc)
Но мне всё же интересен первый случай, когда мы программе передаём сам объект без const и почему именно так тогда нельзя выводить в поток (a+b) например.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru