Книга является подробным руководством по среде разработки Visual C++ .NET. В ней содержится полная информация о языках программирования C/C++, Visual C++ 7 и C#. Освещены как процедурно-ориентированный, так и объектно-ориентированный подходы к созданию программ. Изложены базовые принципы программирования в среде Windows, а также работа с библиотеками MFC и STL. Подробно рассматриваются вопросы использования механизма OLE и динамически подключаемых библиотек. Представленный в книге код можно применять при разработке собственных проектов. Книга рассчитана на программистов, которые хотят изучить тонкости программирования на языках C++ и C#.
Содержание
Введение
ЧАСТЬ 1
Введение в C++
Глава 1. Компилятор Visual Studio .NET 7
Особенности Visual C++ 7.0
Вариант для профессионалов
Корпоративный вариант
Требования к аппаратному и программному обеспечению
Стандартная установка Visual С++ в системе Windows
Каталоги
Документация
Средства разработки
Инструмент Solution Explorer
Интегрированный отладчик
Встроенные редакторы ресурсов
Инструменты и утилиты
Средства автоматизации и макросы
ClassView
Настраиваемые панели инструментов и меню
Возможность соединения с Интернет
Решения и файлы проектов
Мастера Wizard
Возможности компилятора
Предварительно скомпилированные заголовочные файлы и типы
Библиотека MFC
Макроподстановка функций
Опции компилятора
General
Debug
C/C++
Link
Resources
Browse Info
Резюме
Глава 2. Краткое знакомство с MDE
Запуск Visual C++
Доступ к контекстной справке
Вызов команд меню
Перемещаемые панели инструментов
Команда Auto Hide
Команды Navigate Backward и Navigate Forward
Меню File
New
Open
Close
Add New Item, Existing Item, AddProject
Open, Close Solution
Save
Save As
Save All
Source Control
Page Setup
Print
Исторические списки
Exit
Меню Edit
Undo
Redo
Cut
Copy
Paste
Cycle Clipboard Ring
Delete
Select All
Find and Replace
Go To
Insert File As Text
Advanced
Bookmarks
Outlining
IntelliSense
Меню View
Open и Open With
Solution Explorer
Class View
Server Explorer
Resource View
Properties Window
Toolbox
Pending Checkins
Web-browser
Other Windows
Show Tasks
Toolbars
Full Screen
Navigate Backward и Navigate Forward
Property Pages
Меню Project
Add Class, Resource, New-Existing Item
Add Web Reference
Set As StartUp Project
Меню Build
Build Solution
Rebuild Solution
Clean
Build, Rebuild, Clean
Batch Build
Configuration Manager
Compile
Меню Debug
Windows
Start
Start Without Debugging
Processes
Exceptions
Step Into и Step Over
New Breakpoint
Clear All Breakpoints
Меню Tools
Debug Processes
Connect to Database
Customize Toolbox
Add-In Manager
Build Comment Web Pages
Macros
External Tools
Customize
Options
Меню Window
New Window
Split
Dockable, Hide, Floating, Auto Hide, Auto Hide All
Список
Windows
Меню Help
Dynamic Help
Contents, Index, Search
Previous, Next Topic и Sync Contents
Show Start Page
Check for Updates
Customer Feedback, Technical Support
Help on Help
About Microsoft Visual C++
Резюме
Глава 3. Написание, компиляция и отладка простейшей программы
Начало работы с Developer Studio
Создание первой программы
Редактирование исходного кода
Сохранение файла
Создание исполняемого файла
Построение программы
Отладка программы
Различие между сообщениями error и warning
Первое сообщение об ошибке
Окна output и sourсe
Использование команды Find and Replace
Элементы диалогового окна Replace
Быстрое обнаружение строк с ошибками
Полезные предупреждения и сообщения об ошибках
Продолжение отладки
Запуск программы
Работа со встроенным отладчиком
Дополнительные средства отладки
Работа с точками останова
Окно QuickWatch
Резюме
Глава 4. Дополнительные возможности Visual C++
Стандартная библиотека шаблонов STL
Сложности разработки приложений для различных платформ
Нереализованные возможности С++
Структуры данных
Понятие STL
История создания библиотеки STL
Необходимая информация о библиотеке STL
Структура библиотеки STL
Обзор элементов библиотеки STL
Новый язык программирования С# от компании Microsoft
Ваше первое консольное приложение на C#
Обычные и ссылочные типы
Предварительно определенные типы данных
Массивы
Операции boxing, unboxing и единая система типов
Операторы
Классы, структуры и перечисления
Пространство имен
Атрибуты, события, индексаторы, свойства и контроль версий
Резюме
ЧАСТЬ 2
Основы программирования
Глава 5. Введение в язык C++
Из истории языка C
Отличия языка C от ранних языков высокого уровня
Достоинства языка C
Недостатки языка С
Язык C - не для любителей!
Стандарт ANSI C
От С к С++ и объектно-ориентированному программированию
Из истории языка C++
Эффективность объектно-ориентированного подхода
Незаметные различия между языками C и C++
Ключевые различия между C и C++
Основные компоненты программ, созданных на языках C/C++
Пять основных свойств хорошей программы на С/С++
Простейшая программа на языке C
Простейшая программа на языке С++
Переход от main к _tmain и от char* к _TCHAR*
Последние обновления в С++, сделанные комитетом ANSI/ISO
Получение данных от пользователя в языке C
Получение данных от пользователя в языке C++
Файловый ввод-вывод
Резюме
Глава 6. Работа с данными
Идентификаторы
Ключевые слова
Ключевые слова, определенные компанией Microsoft
Стандартные типы данных
Символы
Три типа целых чисел
Модификаторы signed и unsigned
Числа с плавающей запятой
Перечисления
Новый тип данных языка C++ - bool
Квалификаторы доступа
Квалификатор const
Директива #define
Квалификатор volatile
Одновременное применение квалификаторов const и volatile
Квалификаторы pascal, cdecl, near, far и huge
Квалификатор pascal
Квалификатор cdecl
Квалификаторы near, far и huge
Преобразование типов данных
Явное преобразование типов
Новый оператор приведения типов
Оператор dynamic_cast
Оператор static_cast
Новый оператор reinterpret_cast
Оператор const_cast
Классы памяти
Объявление переменных на внешнем уровне
Объявление переменных на внутреннем уровне
Правила определения области видимости переменных
Объявление функций
Операторы
Побитовые операторы
Операторы сдвига
Инкрементирование и декрементирование
Арифметические операторы
Оператор присваивания
Комбинированные операторы присваивания
Операторы сравнения и логические операторы
Условный оператор
Оператор "запятая"
Приоритеты выполнения операторов
Стандартные библиотеки С и С++
Резюме
Глава 7. Инструкции
Инструкции выбора
Инструкция условного перехода if
Инструкция if/else
Условный оператор ?:
Конструкция switch/case
Совместное использование конструкций if/else/if и switch/case
Циклы
Цикл for
Цикл while
Цикл do/while
Инструкция break
Инструкция continue
Совместное использование инструкций break и continue
Функция exit()
Функция atexit( )
Резюме
Глава 8. Функции
Прототипы функций
Синтаксис объявления функции
Способы передачи аргументов
Список аргументов по умолчанию
Классы памяти
Область видимости переменных
Рекурсия
Аргументы функций
Формальные и фактические аргументы
Аргументы типа void
Аргументы типа char
Аргументы типа int
Аргументы типа float
Аргументы типа double
Массивы как аргументы
Типы значений, возвращаемых функциями
Тип результата: void
Тип результата: char
Тип результата: bool
Тип результата: int
Тип результата: long
Тип результата: float
Тип результата: double
Аргументы командной строки
Текстовые аргументы
Целочисленные аргументы
Аргументы с плавающей запятой
Дополнительные возможности функций
Макроподстановка функций
Перегрузка функций
Функции с переменным числом аргументов
Область видимости переменных
Возможен ли доступ к переменной вне ее области видимости?
Использование глобальных переменных в функциях
Преимущество локальных переменных перед глобальными
Оператор расширения области видимости
Предотвращение конфликтов локальных и глобальных имен
Резюме
Глава 9. Массивы
Что такое массивы
Свойства массивов
Объявления массивов
Инициализация массивов
Инициализация по умолчанию
Явная инициализация
Инициализация безразмерных массивов
Доступ к элементам массива
Вычисление размера массива в байтах
Выход за пределы массива
Массивы символов
Многомерные массивы
Массивы как аргументы функций
Передача массивов функциям в языке С++
Функции работы со строками и массивы символов
Функции gets( ), puts( ), fgets( ), fputs( ) и sprintf( )
Функции strcpy( ), strcat( ), strncmp( ) и strlen( )
Резюме
Глава 10. Указатели
Указатели как особый тип переменных
Объявление указателей
Использование указателей
Инициализация указателей
Ограничения на использование оператора &
Указатели на массивы
Указатели на указатели
Указатели на строки
Арифметические операции над указателями
Применение указателей при работе с массивами
Распространенная ошибка при использовании операторов ++ и --
Применение квалификатора const совместно с указателями
Другие операции над указателями
Физическая реализация указателей
Использование с указателями функции sizeof() в 16-битовой среде DOS
Указатели на функции
Динамическая память
Указатели типа void
Подробнее об указателях и массивах
Строки (массивы типа char)
Массивы указателей
Дополнительные сведения об указателях на указатели
Массивы строковых указателей
Ссылки в языке С++
Функции, возвращающие адреса
Почему необходимо использовать ссылочные типы
Резюме
Глава 11. Основы ввода-вывода в языке С++
Подсистема ввода-вывода в С++
Потоки cin, cout и cerr
Операторы ввода и вывода данных
Библиотеки stream.h и iostream
Флаги и функции форматирования
Вывод символов в С++
Изменение основания системы счисления
Форматирование строк
Форматирование числовых значений
Файловый ввод-вывод
Определение состояния потока
Резюме
Глава 12. Структуры, объединения и дополнительные типы данных
Структуры
Синтаксис и правила создания структур
Дополнительные правила создания структур в С++
Доступ к членам структур
Создание простейшей структуры
Передача структур функциям
Создание массива структур
Применение указателей на структуры
Передача массива структур функции
Применение структур в С++
Дополнительные возможности при работе со структурами
Объединения
Синтаксис и правила создания объединений
Создание простейшего объединения
Другие типы данных
Применение ключевого слова typedef
Применение ключевого слова enum
Резюме
Глава 13. Дополнительные средства программирования
Совместимость типов данных
Понятия совместимости типов языка С, определенные ANSI
Идентичный тип данных
Типы перечисления
Типы массивов
Типы функций
Типы структур и объединений
Типы указателей
Совместимость сложных типов данных из разных файлов
Макросы
Что такое макрос
Макросы и их параметры
Проблемы, возникающие с расширением макросов
Как создавать и применять пользовательские макросы
Макросы, поставляемые с компилятором
Директивы препроцессора
Директивы #ifdef и #endif
Директива #undef
Директива #ifndef
Директива #if
Директива #else
Директива #elif
Директива #line
Директива #error
Директива #pragma
Условная компиляция
Операторы препроцессора
Оператор преобразования в формат строки
Оператор конкатенации
Оператор преобразования в символы
Правильное применение заголовочных файлов
Создание заголовочных файлов
Предварительная компиляция заголовочных файлов
Создание предварительно скомпилированных заголовочных файлов
Применение предварительно скомпилированных заголовочных файлов
Заголовочные файлы сlimits и cfloat
Устранение ошибок при помощи функции perror()
Связные списки и динамическое распределение памяти
Замечания по использованию связных списков
Простой связный список
Резюме
Глава 14. Программирование: основные библиотеки С/С++
Заголовочные файлы С/С++
Стандартные библиотечные функции
Преобразование данных
Поиск и сортировка данных
Другие операции
Символьные функции
Проверка алфавитно-цифровых, алфавитных значений, а также значений ASCII
Проверка наличия знаков пунктуации, управляющих символов и пробелов
Преобразование символов в ASCII-код
Строковые функции
Использование функций памяти
Использование строковых функций
Математические функции
Построение таблицы значений тригонометрических функций
Функции обработки времени
Синтаксис структур даты и времени
Резюме
ЧАСТЬ 3
Объектно-ориентированное программирование
Глава 15. Основы ООП
Все новое - это хорошо забытое старое
Структурное программирование
Объектно-ориентированное программирование
С++ и ООП
Основная терминология
Инкапсуляция
Иерархия классов
Виртуальные функции
Первое знакомство с классом
Структура в роли примитивного класса
Синтаксис описания классов в С++
Простейший класс
Резюме
Глава 16. Использование классов C++
Особенности использования классов
Работа с простым классом
Вложенные классы
Работа с конструкторами и деструкторами
Перегрузка функций-членов класса
Дружественные функции
Указатель this
Перегрузка операторов
Перегрузка операторов и вызов функций
Синтаксис перегрузки
Производные классы
Синтаксис наследования
Использование наследования
Резюме
Глава 17. Классы ввода-вывода в языке C++
Использование перечислений в C++
Переменные ссылочного типа
Аргументы по умолчанию
Функция memset()
Форматный вывод данных
Опции ввода-вывода
Иерархия классов ввода-вывода
Файловый ввод
Файловый вывод
Буферы потоков
Строковые потоки
Двоичные файлы
Комбинирование кода языков С и С++
Конструирование уникальных манипуляторов
Манипуляторы без параметров
Манипуляторы с одним параметром
Манипуляторы с несколькими параметрами
Резюме
Глава 18. Работа в объектно-ориентированной среде
Применение стека в C++
Применение связных списков в С++
Создание родительского класса
Производный класс
Использование дружественного класса
Программа, использующая связный список
Результат работы программы
Резюме
Глава 19. Шаблоны и стандартная библиотека шаблонов
История создания библиотеки STL
Преимущества использования библиотеки STL
Стандартизация языков
Структура библиотеки STL
Контейнеры
Адаптеры контейнеров
Алгоритмы
Итераторы
Дополнительные элементы библиотеки STL
Шаблоны вне структур
Ключевое слово template
Шаблоны функций
Шаблоны классов
Библиотека STL: проблемы с шаблонами Шаблон
Шаблонные векторы
Реализация векторов
Шаблоны функций вектора
Доступ к элементам шаблона
Вставка и удаление элементов шаблона
Два различных размера векторов
Другие операции шаблона
Синтаксис шаблона
Операции typedef шаблона
Перегруженные операторы шаблона
Методы шаблона
Примеры программ
Резюме
ЧАСТЬ 4
Мастера для создания приложений Windows
Глава 20. Концепции и средства программирования Windows-приложений
Основные понятия
Среда Windows
Преимущества Windows
Формат исполняемых файлов
Базовые концепции программирования в среде Windows и терминология
Что представляет собой окно Windows
Графические элементы окна
Процедурно-ориентированный класс окна
Объектно-ориентированное программирование и окна
Принципы обработки сообщений
Вызов системных функций
Заголовочный файл windows.h
Этапы создания приложения
Инструменты разработки приложений Windows средствами Visual С++
Файлы проектов
Редакторы ресурсов
Резюме
Глава 21. Мастера и процедурные приложения для Windows
Структура приложения
Компоненты Windows-приложений
Функция WinMain()
Структура WNDCLASSEX
Определение оконного класса
Создание окна
Отображение и обновление окна
Цикл обработки сообщений
Оконная функция
Обработка сообщений WM_PAINT
Обработка сообщения WM_DESTROY
Функция DefWindowProc()
Создание процедурно-ориентированного проекта
Наполнение Windows-программы содержанием
Рисование эллипса
Рисование сегмента
Рисование сектора
Рисование прямоугольника
Другой полезный проект
Приложение для построения круговых диаграмм
Файл pie.cpp исходного текста
Резюме
Глава 22. Библиотека MFC
Зачем нужны библиотеки классов
Принципы, лежащие в основе MFC
Ключевые особенности MFC
Все начинается с CObject
Иерархия классов MFC
Текстовый редактор
Построение приложения
Резюме
Глава 23. Мастера и MFC-приложения
Рисование графических примитивов в рабочей области окна
Использование мастера Application Wizard
Модификация кода шаблона
Проверка модифицированного кода
Дополнительные детали проекта
Отображение ряда Фурье
Создание шаблонного кода проекта Fourier
Добавление ресурса диалогового окна
Изменение ресурса меню
Область заголовка и окно About проекта Fourier
Код проекта Fourier
Код для масштабирования графики
Связь диалогового окна с проектом
Тестирование проекта Fourier
Построение гистограмм
Строка заголовка
Меню
Значок окна About
Окно About
Диалоговое окно ввода данных
Ядро кода BarChart
Код для масштабирования графики
Связь диалогового окна с проектом
Тестирование проекта BarChart
Резюме
ЧАСТЬ 5
Современные концепции программирования
Глава 24. Создание Windows-приложений на языке С#
Создание приложения CircleArea на C#
Формы и модули
Solution Explorer
Элементы управления и их свойства
Код проекта, принимаемый по умолчанию
Реакция на события
Изменение значений свойств из кода
Создание на C# Windows-приложения Tester
Резюме
Глава 25. Библиотека STL и Windows
Комплексные числа
Синтаксис шаблона
Класс complex
Класс complex
Класс complex
Пример использования шаблона класса
Windows-приложение, использующее STL и MFC
Код для изменения размеров графиков
Тестирование проекта Complex2
Резюме
Глава 26. Основы механизма OLE
Свойства и спецификации OLE
Объекты
Файлы
Данные
Внедрение
Внедренный объект
Связывание
Разработка приложения-контейнера
Использование мастера AppWizard
Обзор файлов проекта
Тестирование приложения-контейнера
Резюме
Глава 27. Элементы управления ActiveX
Основные концепции
Правила разработки элементов управления
Класс COIeControl
Контейнеры
Создание простого элемента управления ActiveX
Создание проекта TDCtrl
Код, сгенерированный мастером
Модификация шаблона
Изменение формы, размера и цвета элемента управления TDCtrl
События мыши
Заголовочный файл TDCtrlCtrl.h
Тестирование окончательной версии элемента управления
Резюме
Глава 28. Динамически подключаемые библиотеки
DLL, основанные на MFC
Заголовочный файл Framer.h
Файл исходного кода Framer.cpp
Компоновка файла Framer.dll
Приложение, вызывающее DLL
Заголовочный файл DLLDemoView.h
Файл исходного кода DemoView.cpp
Резюме
Глава 29. Создание Web-форм
Элементы управления Web
Элементы управления RadioButton и RadioButtonList
Элемент управления Calendar
Элементы управления Validation
Элементы управления ListBox и DropDownList
Резюме
Предметный указатель
ОТРЫВОК
ЧАСТЬ 2
Основы программирования
Глава 5. Введение в язык C++
Глава 6. Работа с данными
Глава 7. Инструкции
Глава 8. Функции
Глава 9. Массивы
Глава 10. Указатели
Глава 11. Основы ввода-вывода в языке С++
Глава 12. Структуры, объединения и дополнительные типы данных
Глава 13. Дополнительные средства программирования
Глава 14. Программирование: основные библиотеки С/С++
Глава 5
Введение в язык C++
Знакомство с языком программирования C++ мы начнем с исторической справки. Знание истории поможет уяснить, почему С и C++ на протяжении нескольких десятилетий остаются столь популярным среди программистов, а также, что самое главное, понять концепции, лежащие в основе этих языков.
Примеры программ, рассматриваемые в дальнейшем, следует вводить и запускать в среде Microsoft Visual C++. Повторите материал, изложенный в предыдущих главах, где описаны элементарные операции по компиляции и отладке программ.
ПРИМЕЧАНИЕ. При компиляции некоторых программ, представленных в примерах, возможен вывод сообщений об усечении данных, возникшем во время преобразования из типа double в тип float. В процессе работы над примерами настоящей главы такие предупреждения можно оставлять без внимания.
Из истории языка C
История языка C восходит к операционной системе UNIX, поскольку она сама и большинство программ для нее написаны на C. Однако это не означает, что С предназначен исключительно для среды UNIX. Благодаря популярности системы UNIX язык С был признан в среде программистов языком системного программирования, который можно использовать для написания компиляторов и операционных систем. В то же время он удобен для создания разнообразных прикладных программ.
Операционная система UNIX разработана в 1969 г. на маломощном, по современным представлениям, компьютере DEC PDP-7 компанией Bell Laboratories (город Мюррей Хилл, штат Нью-Джерси). Система была полностью написана на языке ассемблера для PDP-7 и претендовала на звание "дружественной для программистов", поскольку содержала довольно мощный набор инструментов разработки и являлась достаточно открытой средой. Вскоре после создания системы UNIX Кен Томпсон (Ken Thompson) написал компилятор нового языка B.
С этого момента можно проследить историю языка C, поскольку язык B Кена Томпсона является его предшественником. Итак, вот "родословная" языка С:
Язык Год и место создания
Algol 60 Разработан международным комитетом в 1960 г.
CPL Combined Programming Language - комбинированный язык программирования. Разработан в 1963 г. группой программистов из Кембриджского и Лондонского университетов
BCPL Basic Combined Programming Language - базовый комбинированный язык программирования. Разработан в Кембридже Мартином Ричардсом (Martin Richards) в 1967 г.
B. Разработан Кеном Томпсоном, компания Bell Labs, в 1970 г.
С. Разработан Деннисом Ритчи (Dennis Ritchie), компания Bell Labs, в 1972 г.
Позднее, в 1983 г., при Американском институте национальных стандартов (American National Standards Institute - ANSI) был учрежден специальный комитет с целью стандартизации языка C, что обусловило разработку стандарта ANSI C.
Язык Algol 60 появился всего на несколько лет позже языка FORTRAN. Это был значительно более мощный язык, который во многом предопределил пути дальнейшего развития большинства последующих языков программирования. Его создатели уделили много внимания логической целостности синтаксиса команд и модульной структуре программ, с чем, собственно, впоследствии и ассоциировались все языки высокого уровня. К сожалению, Algol 60 не стал популярным в США. Многие считают, что причиной тому была определенная его абстрактность.
Разработчики языка CPL попытались приблизить "возвышенный" Algol 60 к реалиям конкретных компьютеров. Однако этот язык остался таким же трудным для изучения и практического применения, как и Algol 60, что предопределило его судьбу. В наследство от CPL остался язык BCPL - упрощенная версия языка CPL, сохранившая лишь основные его функции.
Когда Кен Томпсон взялся за разработку языка B для ранней версии системы UNIX, он попытался еще больше упростить язык CPL. Ему удалось создать довольно интересный язык, который эффективно работал на том оборудовании, для которого был спроектирован. Языки B и BCPL, очевидно, были упрощены больше, чем нужно: их применение ограничивалось решением весьма специфических задач.
Например, когда Кен Томпсон завершил работу над языком B, появился новый компьютер PDP-11. Система UNIX и компилятор языка B были сразу же модернизированы в соответствии с характеристиками новой машины. Хотя PDP-11 по мощности превышал своего предшественника PDP-7, возможности этого компьютера оставались все еще слишком скромными по сравнению с современными стандартами. Он имел только 24 Кб оперативной памяти, из которых 16 Кб отводились операционной системе, емкость жесткого диска составляла 512 Кб. Возникла идея переписать систему UNIX на языке B. Но B работал слишком
медленно, поскольку оставался языком интерпретирующего типа. Существовала и другая проблема: язык B ориентировался на работу со словами, тогда как компьютер PDP-11 оперировал байтами. Стала очевидной необходимость усовершенствования языка B. Работа над более совершенной версией, которую назвали языком C, началась в 1971 г.
Деннис РитчиДеннис Ритчи, создатель языка C, частично восстановил такое свойство языка, как независимость от конкретного оборудования, которым практически не обладали языки BCPL и B. За счет этого были успешно введены в эксплуатацию типы данных и в то же время сохранена возможность прямого доступа к оборудованию - идея, заложенная еще в языке CPL.
Многие языки программирования, разработанные одним автором (C, Pascal, Lisp и APL), отличались большей целостностью, чем те, над которыми трудились группы разработчиков (Ada, PL/I и Algol 60). Кроме того, для языков первой категории характерна определенная ориентация на решение тех вопросов, в которых автор наиболее компетентен. Деннис Ритчи - признанный специалист в области системного программирования, а именно в области языков программирования, операционных систем и генераторов программ. Учитывая профессиональную направленность автора, нетрудно понять, почему C был
признан прежде всего разработчиками системных программ. Язык C представлял собой язык программирования относительно низкого уровня, что обеспечивало контроль каждой мелочи в работе алгоритма и достижение максимальной эффективности. Но в то же время в C были заложены принципы языка высокого уровня, что позволяло избежать зависимости программ от особенностей архитектуры конкретного компьютера. Это повышало эффективность процесса программирования.
Отличия языка C от ранних языков высокого уровня
Вам, конечно, интересно узнать, какое место занимает C в ряду языков программирования. Чтобы ответить на этот вопрос, рассмотрим иерархию языков, где точками представлены промежуточные этапы развития (рис. 4.1). К примеру, давние предки компьютеров, такие как станок Джакарда (Jacquard's loom, 1805 г.) и счетная машина Чарльза Беббиджа (Charles Babbage, 1834 г.), программировались механически для выполнения строго определенных функций. Не исключено, что в скором будущем мы сможем управлять компьютерами, посылая нейронные импульсы непосредственно в кору головного мозга, наприме
р, подключив воспринимающие контакты к височной области мозга (участвующей в запоминании слов) или к области Брока (управляющей функцией речи).
Первые языки ассемблера, которые появились вместе с электронными вычислительными машинами, позволяли работать непосредственно со встроенным набором команд компьютера и были достаточно простыми для изучения. При их использовании проблема рассматривалась с точки зрения работы оборудования. Поэтому программисту постоянно приходилось заниматься перемещением байтов между регистрами, осуществлять их суммирование, сдвиг и, наконец, запись в нужные области памяти для хранения результатов вычислений. Это была очень утомительная работа с высокой вероятн
остью допуска ошибок.
Первые языки высокого уровня, например FORTRAN, разрабатывались как альтернатива языкам ассемблера.···
· ··
· +·
· Во втором коде для директивы #include указано имя файла iostream вместо stdio.h. Заголовочный файл stdio.h содержал специфические для С определения, необходимые для осуществления стандартных операций ввода/вывода. Синтаксис .h характерен для старого стиля. Файл iostream содержит специфические для С++ определения, необходимые для выполнения простых операций ввода/вывода. Имя файла без расширения .h соответствует последним требованиям стандарта ANSI/ISO С++. ±···
· ··
· w·
· Третье различие связано с использованием оператора объявления (добавления) пространства имен std, что также относится к разряду новых требований, сформулированных в стандарте ANSI/ISO С++ (мы еще вернемсВ среде разработки Visual Studio .NET 7.0 компанией Microsoft введено понятие программного отображения общего текста (generic-text routine mappings). В заголовочном файле tchar определены макросы, или встраиваемые функции, отображения кодов символов для моделей MBCS (MultiByte Character Set - набор символов, каждый из которых представлен однобайтовым или двухбайтовым значением), SBCS (Single-Byte Character Set - на
бор однобайтовых символов) и Unicode. Эти функции задают представление символьных данных как значений ANSI ASCII с помощью одиночного байта или двух байтов в стандарте Unicode. При написании алгоритмов, предназначенных для работы со стандартом Unicode, все функции main() должны быть представлены в виде _tmain(), а указатели символов char* - в виде_TCHAR*.
Последние обновления в С++, сделанные комитетом ANSI/ISO
В процессе разработки стандартной библиотеки шаблонов STL комитет ANSI/ ISO нашел возможность внести некоторые изменения в стандарт языка С++. Эти изменения касаются в основном возможностей, которые присущи и другим языкам и до сих пор не были реализованы в традиционном С++. Указанные изменения содержатся в расширениях языка и не повлияют на программы, написанные ранее на С++.
Использование пространства имен
Пространство имен определяет область видимости констант, переменных, функций, классов и т. д. Идентификаторы пространства имен самого низкого уровня объявляются в пределах функции. С этим уровнем ассоциируются функции-члены и объявления методов. Более высокий уровень имеет пространство имен в пределах класса.
Область видимости файлов определяется пространством имен файлов. Например, если для создания исполняемого файла 123.exe необходимы файлы 1.cpp, 2.cpp и 3.cpp, то идентификаторы, объявленные в файле 1.cpp, будут невидимы (по умолчанию) для кода в файлах 2.cpp и 3.cpp.
Наиболее высокий уровень имеет пространство имен программы или рабочей области. Долгие годы такая иерархия позволяла создавать корректно работающие программы без конфликтов имен. Современные программы представляют собой комбинацию исходных файлов, созданных автором, компилятором, а также другими разработчиками. При таком положении вещей определения области видимости программы будет недостаточно для предотвращения конфликтов имен между категориями. Пространства имен позволяют защитить все идентификаторы в программе, что предотвращает разнообр
азные коллизии.
Опасность коллизии обычно существует для внешних глобальных идентификаторов, используемых повсеместно в программе. Эти глобальные имена являются видимыми для всех объектных модулей прикладной программы, внешних классов и библиотек, а также системных библиотек компилятора. Если две переменные в глобальной области видимости имеют одинаковые имена, компоновщик выдает сообщение об ошибке.
Многие разработчики компиляторов решают эту проблему за счет присваивания каждой переменной уникального идентификатора. Например, стандартный компилятор С добавляет знак подчеркивания в качестве префикса к каждому имени глобальной переменной, а программистам рекомендуется избегать такой формы написания для предотвращения конфликта имен.
Некоторые производители во избежание конфликтов снабжают имена глобальных переменных мнемоническим префиксом. Но даже такой метод окажется неэффективным, если два разработчика употребляют один и тот же префикс. Проблема в том, что язык не имеет встроенного механизма, который отделял бы глобальные идентификаторы от идентификаторов других библиотек, подключенных к приложению.
В распоряжении программиста имеются три способа предотвращения коллизий: модифицировать исходный код; убедить авторов кода, с которым сопряжены конфликты, изменить объявляемые имена; выбрать альтернативный код, выполняющий те же функции. Не слишком приятные перспективы!
Ключевое слово namespace в С++ позволяет ограничить область видимости переменных пространством имен. Если ссылки на глобальные имена, объявленные внутри блока, расположены за пределами этого блока, то они должны содержать идентификатор пространства имен. Фактически, это равноценно применению префиксов. Однако идентификаторы пространства имен, в отличие от двух- и трехсимвольных префиксов, состоят из большего числа символов, благодаря чему гарантия их корректной работы намного выше.
Эффективная работа: Visual C++ .NET. / К. Паппас, У. Мюррей - СПб: Питер, 2002. - 816 с.
|