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

Перегрузка операций (операторов). Перегрузка операторов инкремента и декремента. Перегрузка оператора индексирования. Перегрузка оператора вызова функции.

Читайте также:
  1. IV НОРМИ І ВИМОГИ ОХОРОНИ ПРАЦІ НА РОБОЧОМУ МІСЦІ ОПЕРАТОРА КОМП'ЮТЕРНОГО НАБОРУ
  2. Администратор - Операционный день -Просмотр операций– Касса
  3. ВИД ВЫЗОВА
  4. Виды дипломатических и консульских структур РФ за рубежом, их задачи и функции. Порядок выезда из РФ российских граждан и виды оформляемых для этого паспортов.
  5. Вызова скорой медицинской помощи
  6. Выполнение контроля выражений с помощью оператора Assert
  7. Градации структуры, сопровождаемые сменой функции.

Перегрузка инкремента ++ и декремента --

По сравнению с другими операторами у этих есть особенность - вы можете использовать их как в префиксной (++i, --i), так и в постфиксной (i++, i--) нотации. В первом случае оператор возвращает значение операнда до изменения, во втором - после:

int i, j;

 

j=0; i=++j; // i==1, j==1

 

j=0; i=j++; // i==0, j==1

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

Пример:

class Int

{

private:

int Key;

public:

Int(int = 0);

Int& operator++(); //Префиксная форма.

const Int operator++(int); //Постфиксная форма.

};

Int& Int:: operator++()

{

++Key;

return *this;

}

const Int Int:: operator++(int)

{

Int temp(*this);

++Key;

return temp;

}

Следует отметить, что в начальных версиях языка C++ при перегрузке операций ++ и -- не делалось различия между постфиксной и префиксной формами.

В современной же версии языка C++ принято следующее соглашение:

Перегрузка префиксных операций ++ и -- ничем не отличается от перегрузки других унарных операций. Другими словами, функции конкретного класса: operator++ и operator--, определяют префиксные операции для этого класса.

При определении постфиксных операций "++" и "--" операции-функции должны иметь еще один дополнительный параметр типа int. Когда в программе будет использовано постфиксное выражение, то вызывается версия функции с параметром типа int. При этом параметр передавать!не нужно!, а значение его в функции будет равно нулю.

Перегрузка оператора индексирования.

Только что мы с вами разобрали особенности перегрузки инкремента и декремента. Теперь поближе познакомимся с еще одним "особенным" оператором - оператором индексирования ([] - квадратные скобки).

Итак, вполне логично предположить, что выражение A [ i ], где A - объект абстрактного типа class, представляется компилятором как A.operator [ ] (i). Рассмотрим пример:

# include <iostream>

using namespace std;

class A{

 

// массив из 10 элементов

// типа int

int a[10];

 

// размер массива

int size;

 

public:

 

 

// конструктор без параметров

A(){

size=10;

for (int i = 0; i < 10; i++)

 

// очевидно, что операция [], использованная здесь,

// в конструкторе класса А, является стандартной,

// так как она выполняется над именем массива типа int.

 

a [i] = i + 1;

 

}

 

// перегрузка оператора

// индексирования

// возврат по ссылке осуществлен

// для ситуации ОБЪЕКТ[i]=ЗНАЧЕНИЕ

// на место вызова индексирования

// вернется сам объект

int&operator[](int j){

 

// возврат конкретного объекта

return a [j];

}

 

// функция которая возвращает

// размер массива

int Get () const {

return size;

}

 

};

 

void main () {

 

int i,j;

 

// Работа с одним объектом типа А

A object;

 

cout<<"\nOne object:\n";

 

for(i=0;i<object.Get();i++){

 

// выражение array[i] интерпретируется как

// object.operator [](j).

cout<<object[i]<<" ";

}

 

cout<<"\n\n";

 

// Работа с массивом объектов типа А

A array [3];

 

cout<<"\nArray of objects:\n";

 

for(i=0;i<3;i++){

 

for(j=0;j<object.Get();j++){

 

// выражение array[i][j] интерпретируется как

// (array [i]).operator [](j).

// Первая из двух операций [] является стандартной,

// так как выполняется над именем массива.

// При этом неважно, какой тип имеют его элементы.

// Вторая операция [] - переопределенная,

// так как результатом первой операции [] является объект типа А.

 

cout << array [i][j] << " ";

 

}

cout <<"\n\n";

}

}

___________________________________

 

Результат работы программы:

 

One object:

1 2 3 4 5 6 7 8 9 10

 

 

Array of objects:

1 2 3 4 5 6 7 8 9 10

 

1 2 3 4 5 6 7 8 9 10

 

1 2 3 4 5 6 7 8 9 10

 

Маленький примерчик:

 

class Int

{

private:

int Key;

public:

Int(int = 0);

int& operator[](int);

};

int& Int:: operator[](int i)

{

//без проверки на границе массива

return Key[i];}

Перегрузка оператора вызова функции.

Прототип функции для перегрузки оператора вызова функции выглядит следующим образом:

тип_возвращаемого_значения operator () (список_аргументов);

 

Перегруженный оператор вызова функции не изменяет механизма вызова функции, он изменяет только то как оператор интерпретируется при его применении к объекту данного класса. Перегруженный оператор вызова функции должен быть нестатической функцией-членом класса.

class Matrix {

public:

Matrix();

Matrix(int, int);

Matrix(const Matrix&);

 

//Переопределение оператора

float operator() (int, int);

float* operator[] (int);

 

//Статический компонент - счётчик объектов

static int count;

 

//Вывод матрицы

void Show();

 

 

protected:

int cols;

int rows;

float **matrix;

};

 


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


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

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