- •1. Инкапсуляция
- •2. Полиморфизм
- •3. Наследовние
- •3) Базовые конструкции
- •12)Описание и определение функций
- •13)Назначение прототипа функции
- •14)Операторы
- •15)Массивы-конечная совокупность данных одного типа
- •20)Передача параметров в функции
- •24)Случаи, когда нельзя обойтись без указателей
- •2 5) Динамическое распределение памяти
- •27)Работа с указателями на примере строк
- •30)Сегмент данных для хранения констант
- •31)Функции стандартной библиотеки для работы со строками string.H
- •21) Функция strtok
- •33)Пример использования массивов указателей
- •22) Указатели на функции.
- •Стандартные операции , определенные для предпроцессора
- •Переопределение макросов
- •34)Тэги(tags)
- •37)Динамические структуры данных, основанные на структурах-двунаправленные списки
- •38)Представление списков в программе
- •39)Основные операции над двунаправленными списками
- •40)Инициализация структур
- •41)Объединения
- •38) Открытие потока ввода-вывода,
- •39)Форматированный и неформантированнй ввод и вывод
- •40)Работа с указателем текущей позиции в файле.
- •Главные признаки объектно-ориентированного подхода (Alan Kay).
39)Форматированный и неформантированнй ввод и вывод
40)Работа с указателем текущей позиции в файле.
При чтении данных из файла указатель текущей позиции перемещается к очередному непрочитанному символу. Существует несколько функций, с помощью которых можно управлять положением этого указателя.
long ftell (FILE *f);
ftell – возвращает текущее значение указателя позиции в файл, отсчитанное в байтах от его начала.
int fseek – возвращает 0, если удалось переместить указатель и не0, если ошибка.
int fseek (FILE *f, long offset
int origin);
offset – смещение в байтах
int origin – с какой позиции задавать смещение
Константы: SEEK_SET указатель, что смещение с начала
SEEK_CUR текущее положение
SEEK_END с конца
fseek (f, i * size of (struct Record), SEEK_SET);
Функция прямого доступа к информации fseek() в языке Си. При прямом доступе можно выполнять операции ввода/вывода, используя систему ввода/вывода языка Си и функцию fseek(), которая устанавливает указатель текущей позиции в файле. Прототип этой функции имеет следующий вид: int fseek(FILE *указатель файла, long int колич_байт, int начало_отсчета);
Главные признаки объектно-ориентированного подхода (Alan Kay).
В прогр. всё явл. объектом.
Вычисления имеют вид взаимодействия объектов.
Каждый объект имеет собств. область памяти.
Каждый объект является представителем класса.
Поведение объекта определяется классом.
Классы образуют единую древовидную структуру с общим корнем, называемой иерархией наследования.
2)Общеязыковые расширения C++: значения аргументов функции по умолчанию, комментарии, ссылки, встраиваемые (подставляемые) функции, операция разрешения области видимости.
в C++ при вызове функций можно опускать параметры. В таких случаях для опущенных параметров будут использоваться значения по умолчанию.
- значения аргументов функции по умолчанию
void f(int a, double b=1.5);
int main(){ f(1,5.5);
f(-10); // = f(-10, 1.5);
Все аргументы расположенные справа от «по умолчанию» должны быть по умолчанию
- комментарии // строка , /* много строк */
- ccылки это скрытый указатель хранит адрес. Всякий раз когда в программе встречается имя ссылки компилятор принимает операцию разодресации, по этому ему возвращается переменная по этому адресу. В с++ ссылки ведут себя как константные скрытые указатели.адрес для ссылки задается только 1 раз в момент ее определения и дальше адрес не изменяется ,пример: int x=5 int &rx=x. Оба равны 5
- встраиваемые функции: inline f(); - попытка оптимизировать работу программы…. inline-функция - это функция с модификатором ilnline, код которой компилятор может встроить в место вызова функции.
- операция разрешения области видимости. int x=1; int main(){int x=2; printf(“%d”,x);}//::x
3)Перегрузка функций. Механизм реализации перегрузки функций. Спецификация внешней связи.
В С++ можно одновременно задавать несколько функций с одним и тем же именем, если различаются списки их аргументов.
void f();
void f(int,double); Нельзя иметь фунции, отличающ. только типом возвр. знач.
void f(double,int);
Механизм реализации перегрузки функций: Компилятор искажает заданные нами имена, добавляя информацию о типах аргументов функции. Искажение не стандартизировано.
Спецификация внешней связи. Компилятор Си не искажает имя функции, а компилятор С++ искажает и ожидает другое имя. Конструкция, запрещающая С++ искажать имена exturn “C”{void f();} или #include “f.h”.
4) Специальные методы класса. Конструкторы. Деструктор. Конструктор копирования. Операция присваивания. Конструкторы преобразования и методы приведения типа. Операции new и delete для класса.
Специальные методы класса. – являются методы необходимые любому классу независимо от его спецификации.почти все такие методы должны быть у любого класса , если мы не создаем такие методы то их создает компилятор
методы обеспеч. общее функцианирование любых классов.
Конструкторы – вызываются при создании нового обьекта. Задача – инициализация обьекта, т.е. дать нач. знач. для всех его полей. -Имя констр. совпадает с именем класса.
-Не задается тип возвр. значения. -М.б. перегружен. -Не наследуются –Не м.б. виртуальной функцией. class A{ public: int a; A(){a=0;}; A(int x){a=x;}}
E
сли
нет конструкт.-’’конструктор по
умолчанию''
int main(){ A x, y(10);}
Деструкторы - вызывается перед уничтожением любого обьекта. При выходе обьекта из области видимости вызывается деструктор. ~ <имя класса>(){}; Для класса м.б. вызван только 1 деструктор. Если деструктор явно не созд. - его создает компилятор.
Конструктор копирования – вызывается если созданный обьект должен быть копией уже существующ. обьекта того же класса. –Конструктор с одним аргументом, ссылкой на обьект своего класса. class A{ int a; A(){a=0;}; A(A& x){a=x.a;};
Операция присваивания A operator = (A a2){ a1=a2; // = a1.operator=(a2);}
Конструкторы преобразования. – используется для того чтобы объект чужого класса превратить в объект нашего класса. К.п. – это констр. с 1им аргументом. Тип аргумента-чужой тип, который. преобраз. в объект нашего класса. Class A{ int a; A(int x=0)!!!{a=х};}
void f(A x); int main(){ f(5); A x(10); - разрешено т.к. есть преобразование. !!!
Приведе́ние ти́па — преобразование значения переменной одного типа в значение другого типа. int X; int Y = 200; char C = 30;
X = (int)C * 10 + Y; //переменная С приведена к типу int.
Операции new и delete для класса - Если для класса явно не заданы, то можно исп. стандартные версии: new:-выделяет память в куче,-вызывает конструктор
delete:-освобождает память,-вызов деструктора
void *operator new(int size){return malloc(size);}
void operator delete(void *p){free(p);}
Конструкторы преобразования и операции присваивания типа. Поля и методы класса в целом.
Общая структура программы на C++
Общая структура программы на java
Константные объекты класса. Константные методы. Ключевое слово mutable. Пример реализации двусвязного списка с помощью классов.
Для константных объектов запрещен вызов не константных методов класса. Константный метод в общем случае не может изменять значение полей класса. Константные методы можно вызывать для неконстантных объектов класса. class A{int a;
int getA() const{return a;}}
mutable int a; -отмечает те поля, знач которых int main() { const A x;
можно изменять в константных методах. int x=getA();}
Пример реализации двусвязного списка с помощью классов.
list.h
сlass List{struct Node{ int key;
char *data;
Node *prev,*next;}
public: List();
~List();
List(List&);//констр. копиров.
List & operator=(List&);
void add(int key,char *data);
void delNode(int key);
void*find(int key);
void show();
void delllist();
private: Note*findNode(int key);
В открытой части List, нигде не используется
класс Node
list.cpp
#include “list.h”
#include “iostream”
using namespace std;
List::List(){first=0;}
List::~List(){delist();}
int List::Node::findNode(int key){Node*tmp=first;
while(tmp){if(tmp->key==key) return key;
tmp=tmp->next}
return 0;}
void List::show(){Node *tmp=first;
while(tmp){cout<<tmp->key<<” . “ <<tmp->data<<endl;}
tmp=tmp->netx;}
Статические поля и методы класса.
class A
{public: static int i;}
/* Обязательно нужно проинициализировать */
int A::i = 0;
int main(){
A::i = 1;}
Статические методы не привязаны к объектам класса, за счет того, что им не пережается скрытый указатель this. Поэтому статические методы можно вызывать даже если нет ни одного объекта класса. В статических методах из-за отсутствия this нет возможности на прямую обращатся к нестатическим полям и методам класса. Если поле объявлено статич., оно ведет себя как внешняя переменная. Размещается в сегменте данных и существует в единств. экземпляре, независимо от того сколько задано обьектов. Статическое поле существует даже если нет обьектов. Статич. поле по умолчанию обнуляется.
