- Определение и перегрузка операторов класса в C++
- Что означает класс операторов foo;
- 3 ответа
- 1. Полное определение не требуется
- 2. Два класса должны ссылаться друг на друга
- Похожие вопросы:
- Что значит оператор * ПОСЛЕ имени класса?
- Решение
- BestProg
- Перегрузка операторов в C++. Операторная функция. Ключевое слово operator . Перегрузка базовых арифметических операторов + , – , * , / . Примеры реализации встроенных операторных функций
- Содержание
Определение и перегрузка операторов класса в C++
В C++ можно определять пользовательские операторы для собственных типов данных. Оператор определяется, как обычная функция-член класса, только после определения возвращаемого типа ставится ключевое слово operator .
Пример определения оператора сложения:
Оператор может быть унарным или бинарным. Унарный оператор не принимает никаких аргументов. Например, оператор отрицания — «!». Бинарный оператор принимает дополнительный параметр. Например, в случае со сложением, принимается второе слагаемое.
Чтобы прояснить картину, попробуем написать класс simple_fraction , который будет описывать простую дробь с целыми числителем и знаменателем. И определим операторы сложения, вычитания, умножения и деления для этого класса.
Для операции деления, мы также сделали проверку деления на ноль.
Пример использования класса simple_fraction :
Операторы можно перегружать так же, как и обычные функции-члены класса. Например, можно перегрузить оператор сложения для двух простых дробей, который будет возвращать новую простую дробь. Тогда, нам придется привести дроби к общему знаменателю и вернуть другую простую дробь.
Задание: усовершенствуйте класс simple_fraction . Перегрузите операторы сложения, вычитания, умножения и деления так, чтобы можно было производить операции над двумя простыми дробями и получать новую простую дробь. Реализуйте приведение двух дробей к общему знаменателю.
Источник
Что означает класс операторов foo;
Я просматривал код проекта и столкнулся с этим утверждением
в различных местах. Класс также не был объявлен ни в одном из включенных заголовков. Кто-нибудь может сказать мне, что это значит?
3 ответа
Возможный Дубликат : Что на самом деле означает ‘foo’? Надеюсь,это не самый глупый вопрос. Всякий раз, когда я читаю о javascript, я вижу, что люди используют слово FOO . Откуда взялось это слово?
Что означает этот стиль перегрузки операторов? class Foo < Foo(int a) < . >>; class Bar < operator Foo() < return Foo(25); >>;
Это прямое заявление. Его можно использовать для классов, структур и функций, и он сообщает компилятору, что это определено в другом месте или позже.
Для классов существует (по крайней мере) два варианта использования.
1. Полное определение не требуется
После прямого объявления компилятор не знает ни размера, ни членов класса, только имя. Этого достаточно для указателей на класс (и ссылок, которые в основном являются синтаксическим сахаром вокруг указателей). Но часто достаточно указателя, и тогда вы можете избежать включения всего файла заголовка в другой. Это помогает ускорить компиляцию, избегая необходимости перекомпилировать все при изменении одного заголовка.
Важным примером использования для этого является так называемая идиома PIMPL , также хорошо описанная здесь в SO под тегом pimpl-идиомы .
2. Два класса должны ссылаться друг на друга
В этом случае требуется прямая декларация, чтобы сделать эту работу приятной. Просто говорю на случай, если вы увидите это в дикой природе, есть уродливый способ использования указателя void и приведения, иногда используемый, когда начинающий программист не знает, как это должно быть сделано.
Я думаю, вы имеете в виду прямое заявление. Он сообщает компилятору, что класс с именем foo будет определен позже. До тех пор это «неполный тип», что означает, что указатели и ссылки на класс могут быть определены. Экземпляры класса не могут быть созданы до тех пор, пока он не будет полностью определен.
Ваше заявление неверно? Я не уверен.. Я знаю, что у вас не может быть «any» места «name».. Возможно, вы пропустили подчеркивание?
Я верю, что вы имели в виду:
В этом случае это прямое объявление функции с именем any_name, которая возвращает экземпляр класса foo.
Я не совсем понимаю, что означает термин object[foo] . Какие-нибудь намеки? Я знаю, что bar[‘unique_prop’] и bar.unique_prop относятся к 2 var foo =
Я боролся с Javascript объектами. Что означает (foo) в function(args)< . >(foo) ?
Похожие вопросы:
Я хотел бы знать, что означает этот код? echo 0 > foo Совершенно новый для команд Unix и Bash. Много чего нужно узнать, но нужен быстрый ответ на этот вопрос.
При чтении этого объяснения значения lvalue и rvalue, эти строки кода застрял со мной: int& foo(); foo() = 42; // OK, foo() is an lvalue Я попробовал это сделать в g++, но компилятор говорит.
Я надеюсь, что это квалифицируется как вопрос программирования, как и в любом учебнике по программированию, вы в конечном итоге столкнетесь с ‘foo’ в примерах кода. (да, верно?) что на самом деле.
Возможный Дубликат : Что на самом деле означает ‘foo’? Надеюсь,это не самый глупый вопрос. Всякий раз, когда я читаю о javascript, я вижу, что люди используют слово FOO . Откуда взялось это.
Что означает этот стиль перегрузки операторов? class Foo < Foo(int a) < . >>; class Bar < operator Foo() < return Foo(25); >>;
Я не совсем понимаю, что означает термин object[foo] . Какие-нибудь намеки? Я знаю, что bar[‘unique_prop’] и bar.unique_prop относятся к 2 var foo =
Я боролся с Javascript объектами. Что означает (foo) в function(args)< . >(foo) ?
что означает следующий код? (это не json — это код, который не генерирует ошибку интерпретатором js) foo: 5 Причина этого вопроса заключается в следующем. В примерах функций со стрелками есть один.
#!/bin/sh unset foo (: $
Что означает @foo || @foo = bar в Ruby? Мне кажется, что оно имеет значение @foo || (@foo = bar) вместо (@foo || @foo) = bar . Это, однако, противоречит тому факту, что || имеет более высокий.
Источник
Что значит оператор * ПОСЛЕ имени класса?
в исходниках хромиума например есть такой отрывок
Что значит определить состояние класса?
Что значит определить состояние класса?
Что значит const в конструкторе класса?
Здравствуйте, не понимаю что значит const в конструкторе класса. Встречался с const только когда он.
Что значит static для переменной-члена класса?
class A< static int x; >; Что значит static для переменной-члена класса?
Решение
Спасибо. кажется разобрался. можно еще вопрос не по теме?
на этом же примере переходить в IDE к определению класса или namespace описанных как тут невозможно?
например я хочу перейти к объявлению
Visual Studio далеко не всегда находит определение классов, она просто не тянет chromium. Самый удобный способ навигации по исходникам хромиума в студии — это установка VsChromium. Netbeans вообще не поддерживается gn’ом, ты как проект создавал?
Добавлено через 1 минуту
Просто любопытно — зачем ты без знания С++ полез в хромиум?
Что значит обобщить базовый классы до некого абстрактного класса
Что значит обобщить базовый классы до некого абстрактного класса??
Что значит оператор «+=»?
Вот 🙁
Что значит длинный набор цифр и букв после Picture.Data=< ?
Вот только часть этого кода Что значат эти буквы и цифры? Почему их ооооочень много? Picture.Data.
Что значит «:» после параметров функции
CSimpleString::CSimpleString(const char* p) : len(0), buff(nullptr) Что значит len(0).
Источник
BestProg
Перегрузка операторов в C++. Операторная функция. Ключевое слово operator . Перегрузка базовых арифметических операторов + , – , * , / . Примеры реализации встроенных операторных функций
Данная тема отображает возможности языка C++ по реализации «перегрузки» операторов. Не все современные языки программирования поддерживают перегрузку операторов. Хорошое понимание процесса программирования перегруженных операторов есть показателем профессиональности и высокого мастерства современного программиста.
Перед рассмотрением данной темы рекомендуется ознакомиться со следующей темой:
Содержание
Поиск на других ресурсах:
1. Что такое унарные и бинарные операторы?
Различают три основных вида операторов: унарные, бинарные и n -арные ( n >2).
Унарные операторы – это операторы, которые для вычислений требуют одного операнда, который может размещаться справа или слева от самого оператора.
Примеры унарных операторов:
Бинарные операторы – это операторы, которые для вычисления требуют двух операндов.
Пример. Ниже отображены фрагменты выражений с бинарными операторами + , – , % , *
n -арные операторы для вычислений требуют более двух операндов. В языке C++ есть тернарная операция ?: , которая для своей работы требует три операнда. Более подробно об этой тернарной операции ?: описывается здесь.
2. В чем состоит суть перегрузки операторов? Что такое операторная функция?
Язык C++ имеет широкие возможности для перегрузки большинства операторов. Перегрузка оператора означает использование оператора для оперирования объектами классов. Перегрузка оператора – способ объявления и реализации оператора таким образом, что он обрабатывает объекты конкретных классов или выполняет некоторые другие действия. При перегрузке оператора в классе вызывается соответствующая операторная функция (operator function), которая выполняет действия, которые касаются данного класса.
Если оператор «перегружен», то его можно использовать в других методах в обычном для него виде. Например, команды поэлементного суммирования двух массивов a1 и a2
лучше вызвать более естественном способом:
В данном примере оператор ‘+’ считается перегруженным.
3. Какими способами можно реализовать операторную функцию для заданного класса? Какие существуют разновидности операторных функций?
Для заданного класса операторную функцию в классе можно реализовать:
- внутри класса. В этом случае, операторная функция есть методом класса;
- за пределами класса. В этом случае операторная функция объявляется за пределами класса как «дружественная» (с ключевым словом friend ). Более подробно о реализации «дружественных» функций за пределами класса описывается здесь .
4. Общая форма операторной функции, которая реализована в классе. Ключевое слово operator
Общая форма операторной функции, реализованной в классе, имеет следующий вид:
- return_type – тип значения, которое возвращается операторной функцией;
- ClassName – имя класса, в котором реализована операторная функция;
- operator # – ключевое слово, определяющее операторную функцию в классе. Символ # заменяется оператором языка C++, который перегружается. Например, если перегружается оператор + , то нужно указать operator+ ;
- argument_list – список параметров, которые получает операторная функция. Если перегружается бинарный оператор, то argument_list содержит один аргумент. Если перегружается унарный оператор, то список аргументов пустой.
5. Пример перегрузки унарных и бинарных операторов для класса, который содержит одиночные данные. Операторная функция реализована внутри класса
Объявляется класс Point , реализующий точку на координатной плоскости. В классе реализованы:
- две внутренние переменные x , y , которые есть координатами точки;
- два конструктора класса;
- методы доступа к внутренним переменным класса GetX() , GetY() , SetX() , SetY() ;
- две операторные функции operator+() и operator-() .
Как видно из вышеприведенного кода, операторная функция operator+() получает один параметр. Это значит, что эта функция реализует бинарный оператор ‘+’ . Этот параметр соответствует операнду, который размещается в правой части бинарного оператора ‘+’ . Операнд, который размещается в левой части оператора ‘+’ передается операторной функции неявно с помощью указателя this данного класса.
Вызов операторной функции осуществляет объект, который размещается в левой части оператора присваивания.
Демонстрация использования перегруженных операторов класса Point в другом методе:
В вышеприведенном коде, в операции суммирования ‘+’ объект P1 вызывает операторную функцию. То есть, фрагмент строки
Реализовать операторную функцию operator+() в классе можно и по другому
В вышеприведенной функции в операторе return создается временный объект путем вызова конструктора с двумя параметрами, реализованного в классе. Если (в данном случае) из тела класса убрать конструктор с двумя параметрами
то вышеприведенный вариант функции operator+() работать не будет, так как для создания объекта типа Point эта функция использует конструктор с двумя параметрами. В этом случае компилятор выдаст сообщение
что значит: нет метода (конструктора) Point::Point() принимающего 2 аргумента.
6. Пример перегрузки оператора ‘*’ , обрабатывающего класс, который содержит массив вещественных чисел. Операторная функция реализована внутри класса
В примере реализуется операторная функция operator*() , которая умножает поэлементно значения внутренних массивов объектов класса ArrayFloat . Если размер массивов неодинаков, то умножается только то число элементов, которое есть минимальным между двумя размерами массивов.
Использование класса ArrayFloat в другом методе
7. Пример суммирования двух массивов. Операторная функция operator+() размещается внутри класса
Задан класс ArrayFloat , реализующий динамический массив чисел типа float . В классе реализованы:
- внутренние переменные size , A , описывающие размер массива и сам массив;
- два конструктора, инициализирующие начальными значениями элементы массива;
- конструктор копирования;
- методы доступа GetSize() , SetSize() , GetAi() , SetAi() , которые реализуют доступ к внутренним переменным массива с соответствующими операциями (выделение памяти, проверка на допустимые границы);
- операторная функция operator=() , которая реализует копирование объектов;
- операторная функция operator+() , которая реализует перегрузку оператора ‘+’ для массивов типа ArrayFloat . Операторная функция добавляет поэлементно значения массивов, которые являются операндами операции ‘+’ .
- деструктор.
Ниже продемонстрировано использование класса ArrayFloat и операторной функции operator+() этого класса.
8. Какие ограничения накладываются на перегруженные операторы?
На использование перегруженных операторов накладываются следующие ограничения:
- при перегрузке оператора нельзя изменить приоритет этого оператора;
- нельзя изменить количество операндов оператора. Однако, в коде операторной функции можно один из параметров (операндов) не использовать;
- нельзя перегружать операторы :: , . , * , ?: ;
- нельзя вызвать операторную функцию с аргументами по умолчанию. Исключение – операторная функция вызова функции operator()() .
9. Какие операторы нельзя перегружать?
Нельзя перегружать следующие операторы:
- :: – расширение области видимости;
- . (точка) – доступ к члену структуры или класса;
- * – доступ по указателю;
- ?: – тернарная операция.
10. Объекты каких типов может возвращать операторная функция? Примеры операторных функций, которые возвращают объекты разных типов
Операторная функция может возвращать объекты любых типов. Наиболее часто операторная функция возвращает объект типа класса, в котором она реализованная или с которыми она работает.
Пример. Задан класс Complex , в котором перегружаются два оператора:
- унарный оператор ‘+’ , возвращающий модуль комплексного числа (тип double );
- бинарный оператор ‘+’ , возвращающий сумму комплексных чисел. Операторная функция возвращает объект типа Complex ;
- бинарный оператор ‘+’ , который добавляет к комплексному числу некоторое вещественное число. В этом случае операторная функция получает входным параметром вещественное число и возвращает объект типа Complex .
Текст класса следующий:
Далее демонстрируется использование класса Complex и перегруженных операторных функций в некотором другому методе
11. Можно ли изменять значения операндов в операторной функции?
Да, можно. Однако такие действия не являются полезными с точки зрения здравого смысла. Так, например, операция умножения
не изменяет значения своих операндов 6 и 9. Результат равен 54. Если операторная функция operator*() будет изменять значения своих операндов, то это может привести к невидимым ошибкам в программах, поскольку программист по привычке, будет считать, что значения операндов есть неизменными.
12. Можно ли реализовать операторные функции в классе, которые перегружают одинаковый оператор, получают одинаковые параметры но возвращают разные значения?
Нет, нельзя. Операторная функция не может иметь несколько реализаций в классе с одинаковой сигнатурой параметров (когда типы и количество параметров совпадают). В случае нарушения этого правила компилятор выдает ошибку:
Например. Нельзя в классе перегружать оператор ‘+’ так как показано ниже
Это правило касается любых функций класса.
13. Можно ли реализовать две и более операторных функции в классе, которые перегружают одинаковый оператор и получают разные (отличные между собой) параметры?
Да, можно. В п. 10 реализован класс Complex , в котором реализованы две операторные функции, которые перегружают оператор ‘+’ разными способами. Эти функции отличаются входящими параметрами.
Источник