Студопедия  
Главная страница | Контакты | Случайная страница

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

Ad hoc полиморфизм

Читайте также:
  1. Биологическое разнообразие. Генетический полиморфизм популяций как основа биологического разнообразия. Проблема сохранения биоразнообразия
  2. Вторичные высыпные элементы. Понятие о полиморфизме.
  3. Генетический полиморфизм
  4. Объектно-ориентированное программирование. Инкапсуляция. Наследование. Полиморфизм.
  5. Полиморфизм
  6. Полиморфизм. Функциональное назначение. Способы реализации. Примеры применения.

+, - , *, / , % // арифметические

=, +=, *= // присваивания.

… и т.д.

Знаки пунктуации: круглые и фигурные скобки, двоеточие, точку с запятой и т.д.

Ввод – вывод в СИ++.

Стандартный заголовочный файл iostream.h.

Библиотека iostream перегружает операторы побитового сдвига.

<< // поместить в выходной поток

>> // считать с входного потока

Потоки:

cout // стандартный поток вывода (“экран”)

cin // стандартный поток ввода (“клавиатура”)

cerr // стандартный поток

Использование потоков аналогично инструкции присваивания по работе со значениями и переменными.

int i;

double x;

cout << “\n Введите число с двойной точностью: ”;

cin >> x;

cout << “\n Введите положительное целое: ”;

cin >> i;

if (i<1)

cerr << “ошибка, i= ” << i << end l;

cout << “ i * x = ” << i * x;

end l (манипулятор) очищает поток и добавляет новую строку.

Пример программы на С++.

// Программа для вычисления наибольшего общего делителя

// (GSD – Greatest Common Division)

# include <iostream.h>

# include <assert.h>

int gcd (int m, int n) // Определение функции

// (заголовок)

{ // блок

int r; // объявление остатка

while (n! = 0){ // не равно

r = m % n; // оператор деления с остатком

m = n; // присваивание

n = r;

} // конец цикла while

return m; // выход из функции со значением m

}

int main ()

{

int x,y,g;

cout << “\n ПРОГРАММА GSD на C++ ”;

do {

cout << “\n Введите два целых числа: ”;

cin >> x >> y;

assert (x * y ! = 0); // предусловие

cout << ”\n GSD ( “<< x <<”, “<< y <<”) = ”

<<( q = gсd (x,y)) << end l;

assert (x % g = = 0 && y % g = = 0); //постусловие

}while (x ! = y);

}

Ad hoc полиморфизм

Полиморфизм (polymorphism) — это способ присваивать различные значения (смыс­лы) одному и тому же сообщению. Смысл зависит от типа обрабатываемых данных. «Объектно-ориентированность» использует преимущества полиморфизма, привя­зывая поведение к типу объекта. Такие операторы, как + или « могут иметь различ­ный смысл в зависимости от типов операндов.

Преобразование — это явное или неявное изменения типа значения. Преобразова­ния представляют собой вид полиморфизма. Перегрузка функций придает функции с одним именем различные значения. Имя получает несколько интерпретаций, завися­щих от выбора функции. Все это называется ad hoc полиморфизм. В этой главе обсужда­ется перегрузка, в особенности перегрузка операторов и преобразование типов данных.

Операторы перегружаются и выбираются на основе алгоритма соответствия сиг­натуре. Перегрузка операторов придает им новые значения. Например, выражение а + b имеет различные значения, зависящие от типа переменных а и Ь. Перегрузка оператора + для определяемых пользователем типов дает возможность применять их в выражениях сложения почти таким же образом, как собственные типы. Выражение а + b может означать конкатенацию строк, сложение комплексных чисел или сло­жение целых, в зависимости от того, являются ли переменные абстрактными типами данных my_string или complex, или собственным типом int. Аналогично, благо­даря функциям преобразования возможны выражения смешанных типов. В этой гла­ве также обсуждаются дружественные функции (friend function), и почему они кри­тичны для перегрузки операторов.

Один из принципов ООП состоит в том, что определяемые пользователем типы должны обладать теми же привилегиями, что и собственные типы. Клиент ожидает удобства при использовании таких типов, не обращая внимания на то, собственные они или нет. Способность производителя достичь такого результата является тестом на соответствие языка объектно-ориентированному применению. В базовом языке собственные типы могут смешиваться в выражениях, потому что это удобно. В про­тивном случае было бы сложно определить привычные преобразования.

Преобразования АТД

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

В предыдущей главе мы обсуждали, в каких случаях конструктор с одним аргументом фактически является преобразователем типа аргумента к типу класса конструктора.

my_string::my_string(const char* p);

Этот конструктор будет автоматически преобразовывать тип char* к типу my_string. Преобразование может быть как явным, так и неявным. Явно оно используется как операция преобразования в функциональной форме или в виде приведения. Так, и приведение

my_string s;

char* logo = "Рога и Копыта Лтд.";

s = static_cast<my_string>(logo);

и преобразование

s = logo; //неявный вызов преобразования

будут работать. Обратите внимание, что такое использование требует перегрузки оператора присваивания (см. раздел 7.7, «Перегрузка операторов присваивания и индексирования», стр. 202).

Здесь показаны преобразования уже определенного типа к пользовательскому типу. Однако пользователь не может добавить конструктор во встроенный тип, такой как int или double. С другой стороны, можно определить специальную функцию преобразования внутри класса. В общем виде подобная функция-член выглядит так

operator тип() { ••••• }

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

В примере с my_string может понадобиться преобразование my_string в char*. Это можно сделать следующим образом:


Дата добавления: 2014-12-18; просмотров: 15 | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2021 год. (0.019 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав