Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Операторная функция operator() с несколькими параметрами

Читайте также:
  1. II. Вторая стадия. Функция производительного капитала
  2. IX. Лечебная функция цехового врача.
  3. Активационная функция.
  4. Аналитическая функция маркетинга
  5. Барьерно-защитная функция
  6. Билет № 49 . Координационная функция.
  7. БИОЭЛЕКТРИЧЕСКАЯ ФУНКЦИЯ УДОВОЛЬСТВИЯ И СТРАХА

И это ещё не всё! Ещё не рассматривались варианты операторной функции operator() с несколькими параметрами. И здесь следует вспомнить о функциях с переменным количеством параметров. Это не единственный, но наиболее оптимальный подход к объявлению операторной функции operator() с несколькими параметрами. Здесь мы не будем вдаваться в детали алгоритма извлечения информации из списка параметров (мы их уже обсуждали раньше), а ограничимся лишь общей схемой объявления и вариантами выражения вызова. В нашей версии (всего лишь одной из возможных!), первым параметром функции всегда будет целое число:

ComplexType& operator () (int,...);// Прототип.::::: ComplexType& ComplexType::operator () (int iKey,...) { cout << "This is operator (" << iKey << ",...)" << endl; return *this; }::::: CDw2(50); CDw2(50, 100); CDw2(50, "Это тоже вызов операторной функции", 3.14, 0,123456789);

В C++ может быть объявлено более трёх десятков различных вариантов операторных функций. К этому выводу приводит анализ списка символов операций, которые потенциально могут входить в качестве элемента имени операции.

Здесь не имеет смысла описывать все возможные операторные функции по отдельности. В этом разделе мы рассмотрим ещё несколько интересных "нетипичных" случаев объявления, в следующих разделах будут описаны типичные общие схемы объявлений операторных функций.

Как известно, операция косвенного обращения -> является бинарной операцией. Её первым операндом является указатель на объект, вторым - имя члена класса.

Однако в C++ соответствующий операторный аналог представляется операторной функцией без параметров. Кроме того, для этой функции регламентируется тип возвращаемого значения. Она должна обязательно возвращать указатель либо ссылку на объект некоторого класса.

Оператор инициализации выполняется один раз перед началом цикла. В данном примере перед началом выполнения цикла переменной ix присваивается значение 2.

Условие используется для управления циклом. Оно вычисляется перед началом каждого повторения цикла. Пока значение условия остается истинным, выполняется оператор. Оператором может быть один оператор или блок операторов. Если в результате первого вычисления условия было получено значение false, то оператор не будет выполнен ни разу. В данном примере в условии проверяется, будет ли значение ix меньше значения seq_size.

выражение вычисляется после каждого повторения цикла. Обычно оно-используется для изменения объектов, которые инициализируются в операторе инициализации и проверяются в условии. Если при первом вычислении условия было получено значение false, то выражение не будет выполнено никогда. В данном примере после каждого повторения цикла значение i X увеличивается на единицу.

Чтобы напечатать все элементы, нужно пройти по всему набору чисел.

cout " "первые " " seq_size

" " элементов ряда пелла:\n\t";

for (intix=0; ix< seq_size; ++ix) cout " pell_seq[ ix ] " 1 ';

cout " '\n';

Можно пропускать оператор инициализации, выражение или, реже, условие цикла. Например, можно переписать предыдущий цикл в таком виде.

int ix = 0; //...

for С; ix < seq_size; ++ix) //...

Точка с запятой нужна для обозначения пустого оператора инициализации.

В контейнере хранятся второй, третий и четвертый элементы каждого из шести рядов. Каким образом можно заполнить контейнер нужными значениями? Для встроенных массивов существует возможность указать список инициализации, список начальных значений всех или части элементов, разделенных запятыми.

int elem_seq[ seq_size ] = {

1, 2, 3, // Фибоначчи 3, 4, 7, // Лукас

2, 5, 12, ¦// пелл

3, 6, 10, // Треугольный

4, 9, 16, // квадратный

5, 12, 22, // пятиугольный

Количество чисел в списке инициализации не должно превышать размер массива. Если для инициализации предоставить меньшее, чем размер массива, количество чисел, то оставшиеся элементы будут инициализированы нулевым значением. По желанию можно оставить работу по вычислению размера массива в зависимости от количества начальных значений компилятору.

// компилятор вычислит размер в 18 элементов int elem_seq[] = {

1,'2, 3, 3, 4, 7, 2, 5, 12,

3, 6, 10, 4, 9, 16, 5, 12, 22

}

105.

Функции-элементы класса могут быть перегружены: то есть две или несколько функций-элементов могут иметь одно и то же имя при условии, что списки их аргументов различаются. Компилятор следит за тем, чтобы вызывалась нужная функция, проверяя соответствие аргументов. Довольно обычной является перегрузка конструкторов. Например:

#include <time.h>

const int TIME_STR_LEN = 30;


Дата добавления: 2015-07-26; просмотров: 64 | Нарушение авторских прав


Читайте в этой же книге: Указатели | Инициализация данных | Структуры | Синтаксис описания шаблона | Полиморфизм | Иерархия классов | Связь с указателями | Указатели | ПРЕДСТАВЛЕНИЕ О ДЕСТРУКТОРЕ | Перегрузка конструкторов |
<== предыдущая страница | следующая страница ==>
Оператор return. Точка вызова и точка возврата| Список операторов, для которых разрешена перегрузка

mybiblioteka.su - 2015-2024 год. (0.007 сек.)