Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Константы и указатели

Существует несколько способов использования ключевого слова const при объявлении указателя.

Во-первых, можно определить указатель на целочисленную константу:

const int *PCInt;

Допускается свободно изменять значение такого указателя, но не значение переменной, на которую он указывает, например:

const int A = 1; int В = 2;

const int *PCInt; //не нужно инициализировать. PCInt не имеет тип const

PC Int = &А;

*PCInt =5; // СШИБКА: нельзя изменять переменную

PCInt = &В; // можно изменять PCInt

Обратите внимание: указателю PCint может быть присвоен адрес целочисленной переменной, которая является константой или таковой не является. Однако, даже если этому указателю присвоен адрес переменной, не являющейся константой, его нельзя использовать для изменения переменной (в этом случае указатель служит для доступа «только для чтения» к переменной, допускающей чтение и запись).

Во-вторых, можно определить константный указатель на переменную, не являющуюся константой, например:

int N;

int *const CPInt = &N;

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

int A = 1; int В = 2;

int *const CPInt = &А; // нужно инициализировать указатель CPInt

*CPInt = 5; // можно изменить переменную указатель

CPInt = &В; // ОШИБКА: нельзя изменить указатель типа const

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

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

const int N = 1;

int *PInt;

 

Pint = &N; // СШИБКА: нельзя присвоить адрес целочисленной

// константы указателю на целочисленную неконстанту

 

*PInt =2; // Если бы присваивание было допустимо, это выражение

// привело бы к изменению переменной-константы!

Константы и ссылки

Можно также определить ссылку на константный объект. Ссылки этого типа можно инициализировать, используя константную переменную

const int A = 1;

const int &RCIntA = A;

или переменную-неконстанту

int В;

const int &RCIntB = В;

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

const int А = 1;

const int SRCIntA = A;

 

int B;

const int &RCIntB = B;

 

RCIntA = 5; //ОШИБКА: нельзя изменять значение ссыпки на константу RCIntB = 10; //ОШИБКА: нельзя изменять значение ссылки на константу

Если константная ссылка (т.е. ссылка на переменную типа const) инициализирована с использованием переменной-неконстанты, то она служит для этой переменной псевдонимом, предназначенным «только для чтения». Это и есть тот редкий случай, когда ссылка ведет себя не так, как переменная, на которую она ссылается.

Кроме того, можно инициализировать константную ссылку, используя константное выражение (вспомните, что нельзя инициализировать ссылку на переменную-неконстанту константным выражением), например:

const int &RCInt = 5; // правильная инициализация

В этом определении компилятор создает временную переменную типа const int, содержащую значение 5, а затем инициализирует PCint как псевдоним этой временной переменной.

Обратите внимание: бессмысленно (хотя и допустимо) объявлять ссылочную переменную константой, поскольку все ссылки автоматически являются константами (вспомните, что после инициализации ссылки ее нельзя сделать ссылкой на другую переменную).

int N;

int &const RClnt = N; // разрешено, но бессмысленно

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

const int CInt = 1;

int &RInt = Cint; // ошибка

RInt =5; // Если бы инициализация была допустима, это выражение

// привело бы к изменению константной переменной!

<== предыдущая лекция | следующая лекция ==>
Константы. Переменная, объявленная как ссылка, служит псевдонимом другой переменной | Константы и функции
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 307; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.