Читайте также:
|
|
+, -, *, /, % // арифметические
=, +=, *= // присваивания.
… и т.д.
Знаки пунктуации: круглые и фигурные скобки, двоеточие, точку с запятой и т.д.
Ввод – вывод в СИ++.
Стандартный заголовочный файл 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; просмотров: 37 | Поможем написать вашу работу | Нарушение авторских прав |