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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Произвести табулирование функции http://www.cyberforum.ru/cpp-beginners/thread424391.html
Прошу, народ! Помогите написать программу в борланде (Borland c++) по рисунку (см. "Само задание"). Завтра экзамен... Вот вроде как начало(не факт, что правильное) #include <iostream.h> #include <math.h> #include <conio.h> void main () { clrscr(); int i,j;float x,y,h;
C++ Удаление из строк Удаление из строк всех букв со сжатием строк ( остаются цифры и символы) PS Дано: 2 строки по 80 символов. http://www.cyberforum.ru/cpp-beginners/thread424385.html
C++ Вывод числа из строки
Нужен вывод заданного символа в строкаx ( индекс вводится с клавиатуры)
Матрица NxM C++
Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, и зна-чение 1 − в противном случае.
C++ С помощью какой библиотеки можно создать файл в формате RTF? http://www.cyberforum.ru/cpp-beginners/thread424372.html
С помощю кокой библиотеки можно создать файл в формате RTF и добавить в него текст?
C++ дан массив размера N Всем привет! С прошедшими праздниками! такой вопрос:дан массив размера N и целые числа K и L (1 <= K <= L <= N) найти сумму элементов с номерами от К до L включительно массив вроде разобрался как вводить. void main() { setlocale(LC_ALL,"russian"); int n; подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.01.2012, 21:04     Перегрузка операторов
dnb_dnb, смысл перегрузки операторов - в более удобном синтаксисе вызова определённых методов (функций). Например, чтобы "сложить" два объекта класса, представляющего целые числа ("сложить" взято в кавычки потому, что класс, представляющий целые числа - абстракция, и в понятие "сложения" объектов этого класса можно вложить всё что угодно; я в данном случае вкладываю в это понятие тот же смысл, который вкладывается в понятие сложения чисел в реальной жизни), можно написать функцию sum, принимающую пару объектов этого класса и возвращающую объект, представляющий их сумму, т.е. так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Integer
{
// Реализация
};
 
Integer sum(const Integer& left, const Integer& right)
{
    // Предполагается, что класс Integer имеет конструктор, принимающий число типа int
    // и метод value, возвращающий число, представляемое конкретным объектом класса,
    // в виде переменной типа int
    return Integer(left.value() + right.value());
}
В этом случае, если a и b - объекты класса Integer, то чтобы получить сумму чисел, представляемых этими объектами, можно написать так:
C++
1
Integer c = sum(a, b);
Однако человеку куда привычнее видеть запись вида
C++
1
Integer c = a + b;
, ведь хотя класс Integer - это абстракция, она представляет вполне конкретную сущность - целое число, для которого мы знаем семантику арифметических операций. Поэтому можно вместо функции sum написать оператор сложения:
C++
1
2
3
4
Integer operator+(const Integer& left, const Integer& right)
{
    return Integer(left.value() + right.value());
}
Как видно, здесь не поменялось абсолютно ничего, кроме названия функции. sum изменилось на operator+. Для компилятора так же не поменялось ничего, потому как когда мы пишем
C++
1
Integer c = a + b;
, компилятор заменяет это на
C++
1
Integer c = operator+(a, b);
, т.е. происходит точно такой же вызов функции, как в случае с sum, с той разницей, что теперь эта функция имеет несколько необычное имя. Кстати, нам и самим никто не запрещает вызывать перегруженный оператор не в операторной, а в функциональной форме, т.е. явно писать
C++
1
Integer c = operator+(a, b);
.
Пример я привёл для случая глобальной перегрузки оператора (т.е. вне класса, не в виде метода, а в виде функции), но никто не запрещает перегрузить оператор для класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Integer
{
public:
    Integer(int integer = 0):
    m_integer(integer)
    {
    }
    
    int value() const
    {
        return m_integer;
    }
    
    Integer operator+(const Integer& right) const
    {
        return Integer(value() + right.value());
    }
    
private:
    int m_integer;
};
Разница в том, что для оператора, перегруженного для класса, количество параметров всегда на один меньше, чем количество реальных операндов оператора (т.е. оператор сложения будет принимать один аргумент, а оператор инкремента (преинкремента, если быть точным) вообще не будет принимать аргументов). Так происходит потому, что в метод класса всегда неявно передаётся ссылка на объект, из которого метод был вызван, и эта ссылка и будет заменять один из операндов (всегда левый для бинарных операторов и единственный для унарных).
 
Текущее время: 07:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru