
- •1.1. Что такое программа и как она выглядит?
- •1.2. Комментарии
- •1.3. Зарезервированные слова и типы данных
- •1.4. Объявление переменных
- •1.5. Операции и выражения
- •1.6. Ввод и вывод
- •1.7. Переменные и константы
- •1.8 Логические операторы
- •1.9. Управляющие операторы
- •1.10. Операторы циклов
- •1.11. Операторы перехода
- •2. Функции
- •2.1. Передача параметров
- •2.2. Библиотечные функции
- •2.3. Локальные и глобальные переменные
- •Объявления функций
- •Время жизни и область видимости программных объектов
- •Int local_var; /* по умолчанию auto */
- •2.4. Перегрузка
- •Виртуальный метод
- •3. Массивы
- •Перечисления
- •Объединения
- •858993459 //Результат будет неопределенным,
- •Множества
- •4. Структуры
- •Int numberPeriod; //число переодов начисления процентов
- •Int page; //Количество страниц
- •Void print(); /*Внимание, записывается только прототип функции */
- •Int yearBorn; //год рождения
- •Int yearBorn; //год рождения
- •4.1. Демонстрационные программы
- •Int done;/*переменная, которая информирует о конце списка файлов */
- •6. Объединения
- •Info;//Обявление переменной типа объединение
- •Info;//Обявление переменной типа объединение
- •7. Объектно-ориентированное программирование
- •7.1. Классы и объекты
- •Демонстрационные программы
- •Результат работы программы
- •7.2. Конструкторы и деструкторы
- •Конструктор копирования
- •Конструктор копирования
- •7.5. Наследование
- •7.3. Создание объектов и обращение к членам объекта
- •8. Абстрактные типы данных
- •9. Пространство имен
- •Void greeting();/*это пространство имен содержит функцию с тем же
- •Void big_greeting(); /*эта функция не попадает ни в одно из созданных подпространств,т.Е. Принадлежит пространству имен std */
- •//Определение функций
- •Void big_greeting() /* определение данной функции не принадлежит ни одному из созданных пространств имен, следовательно дальнейший код помещается в глобальное пространство имен */
- •10. Строки
- •4.3 Демонстрационные программы
- •4.10. Класс string
- •Класс AnsiString
- •Класс AnsiString
- •Класс Set
- •4.9. Перегрузка операторов
- •Использование "умных" указателей
- •4.8. Полиморфизм
- •Главное меню — компонент MainMenu
- •Диалоги
- •Файлы и потоки
- •Ввод-вывод в файл
- •Ifstream inStream; //Объявление входного потока
- •InStream.Open("character.Dat"); /*присоединение файла к входному потоку */
- •InStream.Close(); //закрытие входного потока
- •If(!out){ //при неудачной попытке
- •If(in.Fail()){ //поток не создан, то сообщение и выход
- •Управление потоком ввода-вывода
- •Дополнительные возможности cin и cout
- •Что внутри iostream.H
- •Использование cout
- •Использование символа-заполнителя
- •Управление цифрами значений с плавающей точкой
- •Вывод и ввод одного символа за один раз
- •Чтение ввода с клавиатуры по одному символу за раз
- •Чтение с клавиатуры целой строки
- •Что вам необходимо знать
- •5.2. Ввод имен файлов
- •5.3. Манипуляторы
- •5. Указатели
- •5.1.Типы указателей и операции с указателями
- •Адресная арифметика
- •Сравнение указателей
- •Преобразование типа указателя
- •Указатель void
- •5.2. Динамические массивы
- •Int array[10]; //объявляется массив с именем array
- •Int a[10]; //объявляется массив с именем a
- •Int *array1; //указатель типа int с именем array1
- •Int *array[5];/*массив с именем array, его элементы указатели*/
- •Int (*point)[4][5]; /*объявление указателя на двумерный массив без имени */
- •Использование указателей в функциях и указатели на функции
- •Указатель классов
- •Шаблоны
- •Шаблоны функций
- •Void Swap (t& X, t& y) /* к моменту обращения тип т будет известен и заменен, например, на int */
- •Void sort(t array[], int maxIndex){ /*передали массив и его размер */
- •6.2. Шаблоны классов
- •6.3 Демонстрационные программы
- •7.1 Обработка исключений
- •Исключения и их стандартная обработка
- •Базовый класс исключений vcl Exception
- •Упражнения
- •Обработка исключительных ситуаций, возбуждаемых оператором new
- •Исходные файлы и объявление переменных
- •Связанные списки
- •Void newHead(PtrNode& head, //адрес головного узла
- •Void newHead(PtrNode& head, //адрес головного узла
- •Поиск в связанных списках
- •Void newHead(PtrNode& head, //адрес головного узла
- •Директивы препроцессора.
- •Структура файла проекта
- •Структура make-файла
- •Структура модуля
- •Структура h-файла
- •Файл формы
- •Особенности программирования под Windows.
- •Создание окон.
- •Функция WinMain
- •Создание проекта Win32Application.
- •Библиотека mfc.
- •Создаем код
- •Шпаргалка
- •Структура файла проекта
- •Структура make-файла
- •Структура модуля
- •Структура h-файла
- •Файл формы
- •Файл проекта
- •Введение
- •Свойства компонентов
- •События
- •Менеджер проектов
- •Пример: создание простейшего приложения
- •Графика Внедрение картинок
- •Редактор изображений
- •Классы для хранения графических объектов.
- •If (SelectDirectory( //Компонент библиотеки
- •Методы создания собственной графики. Рисование по пикселам
- •Int px, py; //координаты пикселей
- •Рисование с помощью пера
- •Int px, py; //координаты пикселей
- •Рисование кистью
- •Мультимедиа и анимация Общие сведения о звуковых и видеофайлах
- •Способы воспроизведения звуков
- •Создание мультфильма
- •Воспроизведение немых видео клипов — компонент Animate
- •Проигрыватель MediaPlayer
- •Процессы, потоки, распределенные приложения
- •If include "uOverlayl.H" // включение головного файла приложения
- •Функция CrateProcess
- •Заключение
- •Что такое ansi?
- •Почему вместо русских букв в консольном приложении выводится мусор? Автор: Алексей Кирюшкин Версия текста: 1.0
- •Выход 1
- •Выход 2
- •Выход 3
- •Выход 4
- •Ввод-вывод файлов
- •Выбор компонентов для групповых операций
- •Установка разделяемых свойств компонентов
- •Изменение размера компонентов
- •Выравнивание компонентов
- •Пример: Создание текстового редактора Проектирование формы приложения
- •Создание обработчиков событий
- •Создание меню
5.1.Типы указателей и операции с указателями
Указатели о которых мы говорили выше это, так называемые, указатели-переменные. Наряду с ними существуют указатели-константы. А вообще указатели делятся на две категории – указатели на объекты и указатели на функции. Здесь встретилось новое слово объект. Пока под объектом мы будем понимать все то, что не функция, т.е. это переменные любого типа, массивы и структуры. Позднее мы узнаем, что множество объектов значительно богаче. Определение указателей, как отмечалось, может быть совмещено с их инициализацией так
тип *имя_указателя = выражение;
тип *имя_указателя (выражение);
Пример
int x=1,y=2 ;
int * p1=&x , *p2=&y;
Инициализирующее выражение должно давать адрес, т.е это можни быть явно заданный адрес, уже инициализированный указатель, или выражение, позволяющее получить адрес с помощью операции &. Это значит, что над указателями могут проводиться какие то операции. Действительно, это так, однако по сравнению с операциями над базовыми типами список операций над указателями значительно беднее. Над указателями можно проводить следующие операции:
разыменовывание или доступ по адресу *;
преобразование типов;
присваивание;
получение адреса &;
сложение и вычитание;
инкремент ++;
декремент --;
операции отношений.
С некоторыми из них мы уже знакомы. Другие не на много сложнее. Рассмотрим их.
Начнем с вычитания. Вычитание применимо к указателям на объекты одного типа. Выитание указателей одного типа позволяет определить расстояние меду двумя участками, причем за единицу памяти принимается размер памяти занимаемый этим объектом. Например, есть две переменные типа double. Каждая из них занимает 8 байтов. Даже если они находятся рядом, результатом вычитания указателей будет 1. Если между ними находится еще одна переменная того же типа, то разность будет равна 2. То есть вычитание указателей не совпадает с операцией вычитания адресов.
Вот пример программы иллюстрирующей сказанное
#include <iostream>
#include <windows.h>
using namespace std;
void main(){
SetConsoleOutputCP(1251);
//=============================================
int i1=1,i2=2,*pi1,*pi2;
pi1=&i1; pi2=&i2;
cout<<"Значение указателей типа int"<<endl;
cout<<"pi1="<<pi1<<"\tpi2="<<pi2<<endl; /* «\t»-горизонтальная
табуляция */
cout<<"Разность указателей типа int"<<endl;
cout<<"pi1-pi2="<<pi1-pi2<<endl;
//=============================================
double d1=1,d2=2;
double *pd1=&d1, *pd2=&d2;
cout<<" Значение указателей типа double"<<endl;
cout<<"pd1="<<pd1<<"\tpd2="<<pd2<<endl;
cout<<" Разность указателей типа double"<<endl;
cout<<"pd1-pd2="<<pd1-pd2<<endl;
//=============================================
char ch1='a',ch2='b',*pch1,*pch2;//указатели объявлены как символы
pch1=&ch1; pch2=&ch2;
cout<<" Значение указателей типа char"<<endl;
cout<<"pch1="<<(void *)pch1<<"\tpch2="<<(void *)pch2<<endl;
cout<<" Разность указателей типа char"<<endl;
cout<<"pch1-pch2="<<pch1-pch2<<endl;
//=============================================;
bool b1=true,b2=false, *pb1=&b1,*pb2=&b2;
cout<<" Значение указателей типа bool"<<endl;
cout<<"pb1="<<pb1<<"\tpb2="<<pb2<<endl;
cout<<" Разность указателей типа bool"<<endl;
cout<<"pb1-pb2="<<pb1-pb2<<endl;
}
А вот результат
Действительно для всех базовых переменных разность указателей получилась равной 1.
Динамические переменные, как видно из рассмотренного примера, используются не только для того, чтобы программе хватило памяти. Никакой экономии при создании нескольких динамических переменных нет. Другое дело если эти переменные являются массивами. Особенно удобным является создание, так называемых, динамических массивов, т.е. массивов размер которых может быть известен только к моменту его объявления.Без применения указателей такой массив создать невозможно.
А сейчас рассмотрим еще один пример, в котором используется функция sizeof(argument).Эта функция возвращает количество байт занятых в памяти типом данных или выражением, передаваемым функции. Если передается выражение, то оно не вычисляется. Операцияsizeof обычно используется для определения необходимого объема памяти при размещении переменной операциейnew. Также она бывает необходима для определения числа элементов массива при обработке в цикле. Еслиsizeofстоит перед типом, то тип заключается в круглые скобки. Если перед переменной, то круглые скобки необязательны. Например,
int i;
cout<<sizeof(int);
cout<<sizeof i;
Итак, вот этот пример:
#include <windows>
#include <iostream>
using namespace std;
void main()
{
SetConsoleOutputCP(1251);
cout<<"Результаты различных случаев применения sizeof.\n";
cout<<"char:"<<sizeof(char)<<endl;
cout<<"char&:"<<sizeof(char&)<<endl;
cout<<"char*:"<<sizeof(char*)<<endl;
cout<<"wchar_t:"<<sizeof(wchar_t)<<endl; /* wchar_t расширенный
тип char */
cout<<"bool*:"<<sizeof(bool)<<endl;
cout<<"short*:"<<sizeof(short)<<endl;
cout<<"int:"<<sizeof(int)<<endl;
cout<<"long:"<<sizeof(long)<<endl;
cout<<"double:"<<sizeof(double)<<endl;
cout<<"long double:"<<sizeof(long double)<<endl;
enum DIGIT{ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE}; // enum –это перечисление для тех кто не знает
cout<<"DIGIT:"<<sizeof(DIGIT)<<"Member:"<<sizeof(ZERO)<<endl;
char ca[10];
cout<<"char[10]:"<<sizeof(ca)<<"элементов:"<<sizeof(ca)/sizeof(ca[0])<<endl;
double da[10];
cout<<"double[10]:"<<sizeof(da)<<"элементов:"<<sizeof(da)/sizeof(da[0])<<endl;
struct cd{
char c;
double d;
} cda[10];
cout<<"struct cd[10]:"<<sizeof(cda)<<"элементов:"<<sizeof(cda)/sizeof(cda[0])<<endl;
char *cp=new char[10];
cout<<"new char[10]:"<<sizeof(cp)<<"*cp:"<<sizeof(*cp)<<endl;
int i;
cin>>i;
}
Вот результат