Программирование >>  Дополнительные возможности наследования 

1 ... 172 173 174 [ 175 ] 176 177 178 ... 265


Упражнения

1. Напишите профамму, используюшую четыре стандартных объекта класса

iostream - cin, cout, cerr и clog.

2. Напишите профамму, предлагаюшую пользователю ввести свое полное имя с последующим выводом этого имени на экран.

3. Перепишите листинг 16.9, отказавшись от использования методов putbackO и IgnoreO.

4. Напишите профамму, считывающую имя файла в качестве аргумента командной строки и открывающую файл для чтения. Разработайте алгоритм анализа всех символов, хранящихся в файле, и выведите на экран только текстовые символы и знаки препинания (пропускайте все непечатаемые символы). Закройте файл перед завершением работы профаммы.

5. Напишите профамму, которая выведет заданные аргументы командной строки в обратном порядке, отбросив имя профаммы.




День 17-н

Пространства имен

Одним из дополнений стандарта ANSI С++ является возможность использования профаммистами пространств имен, позволяющих избежать конфликтов имен при работе с большим количеством библиотек. Сегодня вы узнаете:

Какие функции и классы вызываются по имени

Как создаются пространства имен

Как используются просфанства имен

Как используется стандартное пространство имен std

Введение

Конфликты имен возникают из-за недомолвок между разработчиками С и С-Ы-. Стандарты ANSI предлагают способ решения этой проблемы с помощью пространств имен (namespaces). Однако следует проявлять осторожность, так как не все компиляторы поддерживают это средство.

Конфликт имен возникает в тех случаях, когда в двух частях профаммы находятся подобные имена с совпадающими областями видимости. Наиболее часто это случается при использовании различных пакетов библиотек. Например, в разных библиотеках классов контейнеров часто объявляется и используется класс List. (Более подробно классы контейнеров рассматриваются на занятии 19,)

Тот же класс List используется и в библиотеках окон. Предположим, необходимо реализовать набор окон для приложения и применить класс List из библиотеки классов контейнеров. Для этого объявляется экземпляр класса List из библиотеки окон, чтобы поддержать работу окон приложения. Однако в результате может оказаться, что его функции-члены недоступны, поскольку компилятор автоматически связал объявленный класс с аналогичным классом List из стандартной библиотеки классов контейнеров, который вам вовсе не был нужен. *

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

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



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

Вызов по имени функциО и шссов

в процессе анализа кода программы и создания списка имен функций и переменных компилятор проверяет программу на наличие конфликтов имен. Конфликты, которые сам компилятор решить не в состоянии, могут устраняться компоновщиком,

Компилятор не в состоянии проверить конфликты имен в единицах трансляции (например, файлах объектов), Эта задача решается компоновщиком приложений. Поэтому компилятор не покажет даже предупреждение.

Довольно часто компоновщик вьщает сообщение об ошибке Identifier multiply defined (множественное объявление идентификатора). Это сообшение появится в том случае, если вы попытаетесь описать идентификаторы с одинаковыми именами и перекрывающимися областями видимости. Если два идентификатора будут объявлены с общими областями видимости в одном файле источника, то об ошибке сообщит компилятор, Сообшение об ошибке поступит от компоновщика при попытке скомпилировать и связать следующий код программы:

файл first,срр Int IntegerValue = О i Int maln( ) {

int IntegerValue = 0 ;

. . . return 0 ;

) ;

файл second,срр int IntegerValue = 0 ; конец second,срр

Компоновшик вьщает сообщение in second.obj: IntegerValue already defined in first,obj (IntegerValue из second.ob] уже объявлен в first.obj). Если бы эти имена располагались в разных областях видимости, то компилятор и компоновщик не имели бы ничего против.

Может поступить и такое предупреждение от компилятора: identifier hiding (идентификатор скрыг). Суть его состоит в том, что в файле first.срр объявление переменной IntegerValue в функции mainO скрывает глобальную переменную с таким же именем.

Чтобы использовать в функции main() глобальную переменную integerVaalue, объявленную за пределами main(), необходимо явно указать глобальность этой переменной с помощью оператора видимости (::). Так, в следующем примере значение 10 будет присвоено глобальной переменной IntegerValue, а не переменной с таким же именем, объявленной внутри main():

файл first,срр int IntegerValue = О ; int maln( ) {

int IntegerValue = 0 ;

;;IntegerValue = 10 ; присваиваем глобальной переменной IntegerValue



1 ... 172 173 174 [ 175 ] 176 177 178 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика