Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика Экзамен

.pdf
Скачиваний:
10
Добавлен:
02.05.2015
Размер:
738.97 Кб
Скачать

{

...

void Draw() const;

...

};

Figure* figures[10];

figures[0] = new Square(1, 2, 10);

figures[1] = new Circle(3, 5, 8);

...

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

figures[i]->Draw();

В этом случае для каждого элемента массива будет вызвана Square::Draw() или Circle::Draw(), в зависимости от вида фигуры.

Чистой виртуальной функцией называется виртуальная функция-член, которая объявлена со спецификатором = 0 вместо тела:

class Figure

{

...

virtual void Draw() const = 0;

);

Чистая виртуальная функция не имеет определения и не может быть непосредственно вызвана. Цель объявления такой функции — создать в общем базовом классе сигнатуру-прототип, которая не имела бы собственного определения, но позволяла создавать такие определения в классах-потомках и вызывать их через указатель на общий базовый класс. Функция-член объявляется чистой виртуальной тогда, когда её определение для базового класса не имеет смысла. Так, в вышеприведённом примере для базового класса Figure определение функции Draw() не имеет смысла, так как «фигур вообще» не бывает и их невозможно отобразить, но описание такой функции необходимо, чтобы можно было её переопределить в классах-потомках и вызывать методы Draw этих классов через указатель на Figure. Следовательно, вполне логично объявить Figure.Draw() как чистую виртуальную функцию-член.

С понятием чистой виртуальной функции в C++ тесно связано понятие «абстрактный класс». Абстрактным классом называется такой, у которого есть хотя бы одна не переопределённая чистая виртуальная функция-член. Экземпляры таких классов создавать запрещено, абстрактные классы могут использоваться только для порождения новых классов путём наследования. Если в классе-потомке абстрактного класса не переопределены все унаследованные чистые виртуальные функции, то такой класс также является абстрактным и на него распространяются все указанные ограничения.

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

Инкапсуляция[править исходный текст]

Основным способом организации информации в C++ являются классы. В отличие от структуры (struct) языка C, которая может состоять только из полей и вложенных типов, класс (class) C++ может состоять из полей, вложенных типов и функций-членов (member functions). Инкапсуляция в С++ реализуется через указание уровня доступа к членам класса: они бывают публичными (открытыми, public), защищёнными (protected) и собственными (закрытыми, приватными, private). В C++ структуры формально отличаются от классов лишь тем, что по умолчанию члены и базовые классы у структуры публичные, а у класса — собственные.Доступ private protected

public

Сам класс да

да

да

 

Друзья да

да

да

 

Наследники

нет

да

да

Извне нет нет да

Проверка доступа происходит во время компиляции, попытка обращения к недоступному члену класса вызовет ошибку компиляции.

Пример класса, реализующего одномерный массив (это просто иллюстрация, а не образец дизайна!): class Array

{

public: Array() :

len(0),

val(NULL)

{}

Array(int _len) :

len(_len)

{

val = new double[_len];

}

Array(const Array & a); ~Array()

{

Free();

}

inline const double & Elem(int i) const

{

return val[i];

}

inline void ChangeElem(int i, double x)

{

val[i] = x;

}

protected:

void Alloc(int _len)

{

if (len == 0) Free();

len = _len;

val = new double[len];

}

void Free()

{

delete [] val;

len = 0;

}

int len;

double * val;

};

Здесь класс Array имеет 2 публичных функции-члена, 2 защищённых поля, 3 публичных конструктора и публичный деструктор. Описатель inline означает подсказку компилятору, что вместо вызова функции её код следует встроить в точку вызова, чем часто можно достичь большей эффективности.

5. Выражения

Выражения (expression) - самые важные строительные элементы PHP, это часть кода, которая представляется неким значением. Практически все, что вы пишете в программе - это выражения. Можно дать следующее определение выражения - "выражение это все что угодно, имеющее значение", т.е. любая комбинация из переменных и/или операций, которая может быть вычислена интерпретатором для получения значения, называется выражением. Например выражениями являются следующие конструкции:1

2

3

4

5

6

7

8

9 <?php

$var3 + 19

//или

($alpha2 - 35) * $beta3 / 2

?>

Результатом выполнения всех операций, входящих в состав выражения, является значение. Значение (value) - это число, текстовая строка или логическая величина (true, false). Простейшими формами выражений являются литералы и переменные. Значением литерала является сам литерал. Примерами литералов могут служить числа, строки и константы. Переменная выражается присвоенным ей значением:1

2

 

 

3

 

 

4

 

 

5

 

 

6

 

 

7

1

// Числовой литерал

"Назад в будущее" // Строковой литерал

true

// Константа (булево значение)

$user_name

// Переменная, содержащая к примеру строку с именем пользователя

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

Обратите внимание, что выражение и инструкция - это не тоже самое. Инструкции являются указанием интерпретатору совершить какое-либо действие и завершаются точкой с запятой. Выражения всего лишь определяют некоторую совокупность вычислений. В одной инструкции может присутствовать несколько выражений.

Операторы

Оператор - это элемент программного кода, который описывает то или иное действие в выражении. В PHP оператор представляет собой символ, благодаря которому могут производиться различные виды вычислений, сравнений или присваиваний с участием одного или нескольких значений. Разные операторы отличаются типом и количеством операндов. В PHP используется несколько типов операторов: арифметические, присваивания, сравнения, логические и поразрядные (побитовые). Значения, расположенные по сторонам операторов, называются операндами:1 3 + 4

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

Из всего вышесказанного можно сделать вывод, что выражением называются два или больше подвыражений, объединенных операторами. Чем больше у вас подвыражений и операторов, тем длиннее и сложнее выражение.

При работе с операторами особое значение имеют следующие аспекты:

количество операндов

тип операндов

приоритет (порядок исполнения)

ассоциативность операторов

Количество операндов

Разные операторы принимают разное количество операндов. Операторы, которые работают с двумя операндами называются бинарными, к таким операторам относятся сложение, вычитание умножение и т.д.

Другие операторы могут принимать всего один операнд, они называются унарными. Примерами унарного оператора могут служить унарный минус (-), инкремент, декремент и т.д.

Существует также один оператор, который может работать с тремя операндами, такой оператор называется тернарный. Этим оператором является оператор, представляющий собой сокращенную форму записи условного оператора if, о котором мы поговорим позже, когда будем рассматривать условные операторы.

Типы операндов

Создавая выражения, необходимо обращать внимание на типы операндов, с которыми работает каждый из операторов, потому что каждый оператор ожидает получить операнды конкретного типа данных. Например, нельзя выполнить умножение двух строк1 'a' * 'b'

Однако PHP старается максимально облегчить вам жизнь, автоматически выполняя необходимые преобразования типов операндов для конкретных операторов. Следующее выражение вполне допустимо:1 '10' * '10'

В этом выражении интерпретатор PHP автоматически преобразует строки в числа и перемножает их. Но иногда такое автоматическое преобразование невозможно, поэтому будьте внимательны и следите за используемыми типами операндов.

Примечание: Когда PHP выполняет автоматическое преобразование типа, это называется неявным приведением типа, если преобразование типа выполняется вручную - это называется явным приведением типа.

Приоритет

Приоритет оператора определяет порядок исполнения операций при вычислении значения выражения.

Операторы с одинаковым приоритетом обрабатываются в порядке следования в выражении. Например, операции умножения и деления исполняются в том порядке, в котором следуют в выражении, потому что они имеют одинаковый приоритет.

Если выражение содержит операторы с разным приоритетом, то порядок их исполнения может влиять на конечный результат выражения. С помощью круглых скобок ( и ) можно переопределить порядок исполнения операторов или просто улучшить читаемость выражения.1

2

3

4

5

6 <?php

echo 3 * 2 + 5; // выведет 11

echo 3 * (2 + 5); // выведет 21

?>

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

Ассоциативность

Все операторы обрабатывают свои операнды в определенном направлении. Направление обработки называется ассоциативностью и зависит от типа оператора. Большинство операторов выполняет обработку слева направо - такой порядок называется левой ассоциативностью. Левая ассоциативность подразумевает, что выражение вычисляется слева направо, правая ассоциативность - в обратном направлении.

Таблица операторов

ВPHP есть несколько уровней приоритетов, в таблице приведен перечень операторов, отсортированных по уровню приоритета, от высшего к низшему. Операторы на одном уровне имеют одинаковый приоритет.

Вколонке "Ассоциативность" помечены операторы, которые имеют правую ассоциативность, остальные относятся к левой.Оператор Описание Ассоциативность

NEW

Создает новый объект

Справа

 

 

налево

 

 

 

 

 

.

 

 

 

 

 

[]

 

 

 

 

 

()

Доступ к свойству (точечная нотация)

 

 

Индекс массива

 

 

 

 

Вызов функции

 

 

 

 

!

 

 

 

Логическое НЕ

 

~

 

 

 

Битовое НЕ

 

++, --

 

 

 

Операторы инкремента и декремента

 

+, -

 

 

 

Унарный плюс и минус

 

(int)

 

 

 

Оператор приведения типа

 

(float/double/real)

 

 

Оператор приведения типа

 

(string)

 

 

 

Оператор приведения типа

 

(array)

 

 

 

Оператор приведения типа

 

(object)

 

 

 

Оператор приведения типа

 

@

Логическое НЕ

 

Подавление вывода сообщений об

 

 

 

 

 

ошибках

 

*, /, %

Умножение, деление

 

 

 

+, -

 

 

 

 

 

.

Сложение, вычитание

 

 

 

Конкатенация

 

 

 

 

<<, >>

Битовый сдвиг

 

 

 

<, <=, >, >=Операторы сравнения

 

 

 

==, !=

 

 

 

 

 

===, !==, <>

Операторы сравнения

 

 

&

Битовое И

 

 

 

 

ˆ

Битовое ИЛИ-НЕ

 

 

 

|

Битовое ИЛИ

 

 

 

&&

Логическое И

 

 

 

||

Логическое ИЛИ

 

 

 

? :

Условный (тернарный) оператор

 

 

=, +=, -=, *=, /=, .=, %=,

&=, |=, ^=, <<=, >>=, =>

Операторы

присваивания

Справа налево

AND

Логическое И

 

XOR

Логическое ИЛИ-НЕ

 

OR

Логическое ИЛИ

 

,Оператор запятая

Оператор присваивания

Для присваивания значений используется оператор присваивания обозначаемый как "=". На первый взгляд может показаться, что это оператор "равно". На самом деле это не так. Он присваивает значение, стоящее с правой стороны от него, операнду, стоящему с левой стороны:1

2

3

4

5 <?php

$i = 3;

?>

Левым операндом оператора = должно быть левостороннее выражение: переменная, элемент массива или свойство объекта. Правым операндом может быть любое значение, любого типа.

Оператор присваивания также позволяет создавать цепочку операций присваивания:1

2

3

4

5

6

7 <?php

$num1 = $num2 = $num3 = $num4 = 5;

echo $num1, $num2, $num3, $num4;

?>

Список типовых операций[править исходный текст]

Операции обычно переходят из языков в родственные — например, операции языка С присутствуют в языках C++, Java, JavaScript и многих других.Оператор Выполняемая операция Языки программирования

a = b или a := b

присваивание

практически все

 

Арифметические

 

 

 

 

 

a + b

сложение аргументов

практически все

 

a - b

вычитание

практически все

 

 

-a

изменение знака

практически все

 

 

a / b, a div b

деление

практически все

 

 

a % b, a mod b

остаток от деления (деление по модулю) С, Java, PHP, Pascal

a++

 

 

 

 

 

 

a--

увеличение на 1 с присваиванием (инкремент)

 

уменьшение на 1 с присваиванием (декремент)

С, Java, PHP

 

a ^ b или a ** b

возведение в степень

BASIC, Fortran, Ruby

 

Логические

 

 

 

 

 

a & b, или a && b, или a and b

И

практически все

 

a | b, или a || b, или a or b

ИЛИ

 

 

 

~a, или !a, или not a НЕ

 

 

 

 

a = b или a == b

 

 

 

 

 

a <> b или a != b

проверка на равенство

 

 

проверка на неравенство

a > b, a >= b

 

 

 

a < b, a <= b

больше, больше или равно

 

 

меньше, меньше или равно

 

 

 

 

a ? b : c

тернарный условный оператор (если условие a истинно, всё выражение равно b, иначе c) С, C++, Java, PHP

Строковые

 

 

 

 

 

a + b или a & b или a.b (в языке PHP)

конкатенация (слияние)

практически все

Классификация исполняемых операторов

Исполняемые операторы также можно разбить на две группы: простые и структурированные. Как не сложно понять из названий, в структурированных операторах можно выделить части, которые сами могут выступать в качестве отдельных операторов, а простые операторы на более элементарные разложить не удастся.

К простым операторам относятся: оператор присваивания, оператор-выражение, пустой оператор, операторы перехода (goto, continue, break, return), вызов функции как отдельного оператора.

Структурированные операторы — это операторы ветвление (if), выбора (switch), цикла (for, while,do).

Теперь перейдём к рассмотрению отдельных операторов.

Оператор присваивания

Оператор присваивания — это самый употребительный оператор. Его назначение — присвоить новое значение какой-либо переменной. В C++ имеется три формы этого оператора.

1)Простой оператор присваивания записывается так:

переменная = выражение;

Данный оператор работает следующим образом: вначале вычисляется выражение, записанное справа от символа операции = (равно), затем полученный результат присваивается переменной, стоящей слева от знака =. Тип результата должен совпадать с типом переменной, записанной слева, или быть к нему приводимым.

Слева от знака = может быть только переменная, справа же можно записать и константу, и переменную и вообще выражение любой сложности.

Пример операторов

x=3

r=x;

y=x+3*r;

s=sin(x);

2)Множественное присваивание — в таком операторе последовательно справа налево нескольким переменным присваивается одно и то же значение, например:

a=b=c=1;

Так можно сразу определить, к примеру, что в равностороннем треугольнике все стороны равны одному и тому же числу 1. Приведенный выше оператор эквивалентен последовательному выполнению трёх операторов:

a=1;

b=a;

c=b;

Естественно, нам проще записать один оператор, а не три. Программа получается короче, более естественно смотрится текст, и работает такая конструкция немного быстрее.

3)Присваивание с одновременным выполнением какой-либо операции в общем виде записывается так:

переменная знак_операции = выражение;

и равносильно записи

переменная = переменная знак_операции выражение;

Например, оператор:

s += 5; // 1-й вариант

делает то же самое, что и оператор

s = s + 5; // 2-й вариант

а именно: взять старое значение из переменной s, прибавить к нему число 5 и полученное значение снова записать в переменную s.

Как видим, запись 1-го варианта короче записи 2-го варианта, да и выполняется быстрее, так как в 1-м варианте адрес переменной s вычисляется 1 раз, а во 2-м варианте — дважды.

Оператор-выражение

В языке C++ любое выражение (арифметическое, логическое, и т.д.), которое заканчивается символом ; (точка с запятой), считается законченным предложением, т.е. оператором. Примеры:

1)Выполняется префиксная операция автоуменьшения:

--i;

2)Выполняется постфиксная операция автоувеличения:

i++;

3)Выполняется перегруженная операция вывода << :

cout << x;

4)Вызывается функция вывода данных на дисплей монитора (выводится текст «Test»):

printf("Test\n");

5)Вычисляется сумма двух чисел, но её значение не присваивается ни какой переменной. Оператор бессмысленный, но возможный:

a+b;

Пустой оператор

Пустой оператор — это оператор, который ничего не выполняет. Зачем нужен «бесполезный» оператор?

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

Пустой оператор — это одиночный символ ; (точка с запятой), например:

c=a+b; ;

Здесь первый символ ; (точка с запятой) завершает оператор присваивания, а второй символ как раз и даёт нам пустой оператор. В данной ситуации пустой оператор совсем не нужен (но и не является синтаксической ошибкой!), приведен только для пояснения. Более «разумные» примеры использования пустого оператора будут приведены позже в соответствующих темах.

Операторы перехода

Для изменения последовательного выполнения операторов используются операторы перехода. Это операторы goto, continue, break, return. Рассмотрим их подробнее.

1)Оператор goto

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

goto Metka;

//Любые операторы

//...............

Metka:;

Здесь Metka — это идентификатор (метка), обозначающий то место в тексте программы, куда делается переход. Такая метка не требует описания (её и нельзя описывать!), задается по общим правилам и не может совпадать ни с ключевыми словами, ни с именами объектов программы.

В языке C++ этот оператор используется редко. Необдуманное применение goto приводит к затруднению понимания текста программы. Как правило, если в тексте программы требуется использование этого оператора, то это означает слабую логику в проектировании алгоритма программы.

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

2)Оператор break

Данный оператор применяется для выхода из операторов циклов (for, while, do) или оператора выбора switch. При использовании этого оператора метки не нужны, как как управление передаётся на оператор, следующий за оператором цикла или выбора.

Вот этот оператор в программах на C++ применяется очень часто! А оператор switch вообще без break не используют. Примеры применения оператора break рассмотрим в соответствующих темах.

3)Оператор continue

Позволяет передать управление в конец цикла. Применяется гораздо реже, чем оператор break. Как правило, всегда можно построить алгоритм решаемой задачи без использования оператора continue. Пример применения оператора continue рассмотрим в теме «Циклы».

4)Оператор return

Обеспечивает выход из функции. Управление передаётся оператору, следующему за вызовом функции. Примеры применения оператора return рассмотрим в темах, связанных с использованием функций.