Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры программирование.doc
Скачиваний:
7
Добавлен:
17.04.2019
Размер:
257.54 Кб
Скачать
  1. Простые типы данных и операции над данными. Приведение типов. Константы, квалификатор const.

Первую часть см.1-й вопрос.

Константные переменные

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

const int j = 17; // Целая константа

j = 29; // Нельзя, значение не должно меняться

const int i; // Нельзя, отсутствует начальное значение

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

Вообще говоря, вы сообщаете компилятору, какой конструктор он должен использовать в конкретном случае. Если бы переменная i относилась к нетривиальному классу, то при объявлении константного экземпляра пришлось бы явно указать конструктор и его аргументы. int - вырожденный случай, поскольку на самом деле const int j=17; - то же, что и int j(17).

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

const i = 17;

int& j = 1; // Нельзя, потому что позднее j может измениться

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

const и #define

Две следующие строки не эквивалентны:

const int i = 17;

#define i 17;

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

Квалификатор const

Ключевое слово const обозначает константы. Это квалификатор переменной, изменяющий её свойства, делающий её доступной только для чтения. Это означает, что переменная может использоваться так же как и любая ругая переменная этого типа, но её значение не может быть изменено. Если вы попытаетесь присвоить переменной типа константа значение, вы получите ошибку компилятора.

Константы, объявленные с помощью ключевого слова const, подчиняются тем же правилам определения их области видимости, что и другие переменные. Это, и подвохи в использовании директивы #define, делают ключевое слово const превосходным способом задания констант и более предпочтительным, чем использование #define.

Примерconst float pi = 3.14;

float x;

// ....

x = pi * 2; // константы можно использовать в вычислениях

pi = 7; // ошибка - нельзя присваивать значение константе

#define или const

Можно использовать как const, так и #define для создания численных и строковых констант. В массивах можно использовать только константы, объявленные с квалификаторм const. В общем случае лучше использовать const, а не #define для создания констант.