- •1. Основные операции языка Си.
- •3. Язык Си: указатели и массивы. Определения, примеры.
- •4. Язык Си: объявления функций, передача аргументов. Примеры.
- •5. Язык Си: строки и указатели. Определения, примеры.
- •8. Язык Си: структуры. Пример.
- •9 . Язык Си: битовые поля и объединения. Примеры.
- •10. Язык Си: оператор определения типа. Примеры.
- •11.Язык Си: препроцессор. Директивы препроцессора, примеры
- •12.Язык Си: программный стек. Пример работы стека.
- •13. Линейные списки. Операции с линейными списками.
- •14 Hash-таблицы
- •15 Двоичные деревья
- •17. Язык Си: ссылочные типы. Пример.
- •18. Язык Си: защита указателей и объектов, неявное изменение объектов.
- •19. Язык Си: организация ввода/вывода. Пример: слияние файлов. Организация ввода/вывода
- •Открытие файла
- •Закрытие файла
- •Ввод из файла
- •Вывод в файл
- •Особые ситуации
- •Пример: слияние файлов
- •20. Язык Си: произвольный доступ к файлам. Пример.
- •22. Язык Си: примеры реализаций функций ввода/вывода (getc,putc).
- •23. Язык Си: примеры реализаций функций ввода/вывода (fgets, fputs).
- •24. Язык Си: работа с файловой системой. Пример.
- •25. Основные понятия ооп: абстракция, инкапсуляция, наследование, полиморфизм.
- •27. Объекты классов: статические,автоматические, динамические. Примеры.
- •28. Управление доступом к элементам классов. Пример.
- •29. Шаблоны функций и шаблоны классов. Примеры.
- •30. Наследование. Пример.
- •31. Множественное наследование. Пример.
- •П оскольку классы-потомки наследуют все данные и методы классов-предков, в итоге имеем следующую картину:
- •32. Виртуальные функции. Раннее и позднее связывание.
- •33. Абстрактные классы. Их назначение, пример.
- •34. Полиморфный контейнер (пример).
- •36. Конструкторы, их виды, примеры. Вызов конструкторов при наследовании.
- •37. Деструкторы. Их назначение, примеры.
- •39. Перегруженные операции. Примеры.
- •40. Обработка нештатных ситуаций. Объекты-исключения. Примеры.
- •Вопрос 1: какова дальнейшая судьба этих ресурсов, будут ли они освобождены?
- •Вопрос 2: как распознавать подобные ситуации и корректно их обрабатывать?
- •41. Модели жизненного цикла программного обеспечения. Модели жизненного цикла по
- •Спиральная модель жизненного цикла по.
- •42. Проектирование программного обеспечения и uml.
- •Uml (основные понятия)
- •Канонические диаграммы языка uml 2.X
- •43. Диаграммы прецедентов. Нотация, семантика, примеры.
- •Основные обозначения на диаграммах прецедентов:
- •44. Сценарии выполнения прецедентов (пример).
- •45. Диаграммы классов. Нотация, семантика, отношения.
- •46. Атрибуты на диаграммах классов. Нотация и семантика. Примеры.
- •47. Операции на диаграммах классов. Нотация и семантика. Примеры.
- •48. Отношения ассоциации на диаграммах классов.
- •Отношения ассоциации
- •Предприятие
- •Сотрудник
- •Отношения обобщения
- •Отношения композиции
- •53. Язык c#: сборки, манифесты, домены, компоненты.
- •55. Java как язык ооп для машинно-независимых приложений.
- •56. Обзор Java-технологий NetBeans ide.
- •57. Компонентные технологии разработки программного обеспечения.
- •59.Обёртки в языках c# и Java.
- •60. Архитектурный паттерн mvc. Область применения, схема взаимодействия.
39. Перегруженные операции. Примеры.
Пример. Перегруженные операции для строк.
#pragma warning (disable: 4996 4267) //выключаем некоторые предупреждения
#include <string.h> //понадобится для сцепления строк
#include <iostream> //задействуем потоковый ввод/вывод
using namespace std; //пространство имён для потокового в/в
class str{ //опишем класс «строки»
char* s; //указатель на символы
int n; //ёмкость буфера для хранения строки
public:
str() {n=1;s=NULL;} //0-конструктор (по умолчанию)
str(const str&); //конструктор копирования
str(const char*); //конструктор общего вида
~str(){ if(s) delete s;} //деструктор
str& operator ~(); //операция инверсии
str& operator =(char*); // операция присваивания
str& operator =(str&); //операция присваивания
friend str& operator +(str&, str&); //операция сложения
friend str& operator +(str&, char*); //операция сложения
friend str& operator +(char*, str&); //операция сложения
friend istream& operator >> (istream&, str&) //операция ввода
friend ostream& operator << (ostream&, str&) //операция вывода
};
Конструкторы и инверсия строк
//конструктор копирования
str::str(const str &x){
s= new char [n=x.n]; //получим память
strcpy(s,x.s); //небезопасная функция!
}
//конструктор общего вида
str::str (const char* text) {
s=new char[n=strlen(text)+1]; //получим память
strcpy(s, text); // небезопасная функция!
//инверсия строки
str& str::operator~() {
if(n>2) { //имеет смысл для строк длиной больше 1 символа
char temp, *beg=s, *end=s+n-2; //рабочие указатели
while( beg<end) { //пока они не встретятся
temp=*beg; *beg++=*end; *end--=temp; }
}
return *this; //результат работы – сам объект
}
Операции присваивания
//операции присваивания char*
str& str::operator = (char* text) {
if(s) delete[] s; //освободим ранее использованную память
s=new char[n=strlen(text)+1]; //получим память
strcpy(s, text); //небезопасная функция!
return *this; //результат работы – сам объект
}
// операции присваивания str
str& str::operator = (str &x) {
if(this!=&x){ //не присваиваем ли объект самому себе?
if(s) delete[] s; //освободим ранее использованную память
s=new char[n=x.n]; //получим память
strcpy(s, x.s); //небезопасная функция!
}
return *this; //результат работы – сам объект
}
Операции сложения
//дружественная функция: сложение двух объектов str
str& operator+ (str &x1, str& x2) {
str* sum = new str; //новый объект – в нём будет сумма строк
sum->s = new char[sum->n = x1.n + x2.n – 1]; //получим память
strcpy(sum->s, x1.s); //строка из первого объекта
strcat(sum->s, x2.s); //цепляем строку из второго объекта
return *sum; //результат – сцепленные строки
}
// дружественная функция: сложение двух объектов str + char*
str& operator+ (str &x, char* text) {
str* sum = new str; //новый объект – в нём будет сумма строк
sum->s = new char[sum->n = x.n + strlen(text)]; //получим память
strcpy(sum->s, x.s); //строка из первого объекта
strcat(sum->s, text); //цепляем строку из второго объекта
return *sum; //результат – сцепленные строки
}
Сложение, ввод и вывод строк
// дружественная функция: сложение char* и объекта str
str& operator+ ( char* text, str &x) {
str* sum = new str; //новый объект – в нём будет сумма строк
sum->s = new char[sum->n = strlen(text) + x.n]; //получим память
strcpy(sum->s, text); //строка из первого объекта
strcat(sum->s, x.s ); //цепляем строку из второго объекта
return *sum; //результат – сцепленные строки
}
//дружественная функция: потоковый ввод объекта str
Istream& operator>>(istream& z, str& x){
char buf[BUFSIZ]; //рабочий буфер для ввода “stdio.h”
z.get(buf, BUFSIZ, ‘\n’); //используем метод get() объекта z
x=buf; //операция присваивания для класса str уже определена
return z; //возвращаем объект класса istream
}
//дружественная функция: потоковый вывод объекта str
ostream& operator<<(ostream& z, str& x) {
return z<<x.s; //потоковый ввод для char* уже определён в z
}
Тестирование класса str
//посмотрим, как работает класс str
void main (void)v {
str a, b=”xxx”, c; //обзаведёмся тремя объектами
cin>>a; //потоковый ввод
c=a+b; //сложение объектов
cout<<(a+” “+b” “+c)<<endl; //сложение и потоковый вывод
cout<<a<<b<<c<<endl; //инверсия и потоковый вывод
}