Основы работы в С++

Методическое пособие - Компьютеры, программирование

Другие методички по предмету Компьютеры, программирование

?трольные вопросы

) Перегрузка оператора состоит в изменении смысла оператора (например, оператора плюс (+), который обычно в C++ используется для сложения) при использовании его с определенным классом

) Чтобы разрешить существование нескольких одноимённых операций, достаточно ввести в язык правило, согласно которому операция (процедура, функция или оператор) опознаются компилятором не только по имени (обозначению), но и по типам их параметров. Таким образом, abs(i), где i объявлено как целое, и abs(x), где x объявлено как вещественное - это две разные операции. Принципиально в обеспечении именно такой трактовки нет никаких сложностей.

Чтобы дать возможность определять и переопределять операции, необходимо ввести в язык соответствующие синтаксические конструкции. Вариантов их может быть достаточно много, но по сути они ничем друг от друга не отличаются, достаточно помнить, что запись вида ). Достаточно разрешить программисту описывать поведение операторов в виде функций - и проблема описания решена.

) Перегружать можно следующие операторы:

+ - * /% ^ & | ~! =

+= -= *= /=%= ^= &= |=

=

&& || ++ - ->*, -> [] ()new[] delete delete[]

А нельзя (подсмотрел у Страуструпа):

: (разрешение области видимости)

(выбор члена)

* (выбор члена через указатель на член)

?: тернарный оператор, typeid

 

Лабораторная работа №3

Тема: Массивы объектов

 

 

Создать класс для работы со стеком. Элемент стека - действительное число. Применить класс для вывода возрастающих серий последовательности действительных чисел: a) в обратном порядке;

#include stdafx.h

#include stdio.h

#include iostreamnamespace std;

// элемент для стэка

struct elem {

int data;elem* next;

};

// класс стэкаlifo {: elem* begin;

public:

// возвращает первый элемент из стека

struct elem* get() {elem* rez;(begin!=NULL) {=begin;

}{=NULL;

}rez;

};

// поиск элементаelem* search_elem (int idata) {elem* curr;=begin;((curr->data!=idata)&&(curr!=NULL)) {=curr->next;

};curr;

};

// функция созданияelem* create_lifo() {elem* rez;= new struct elem;>next=NULL;rez;

};

// функция добавленияset (int data) {elem* rez;=create_lifo();>data=data;>next=begin;=rez;

};

// удаление элементаdel_1 () {elem* temp;=begin;(begin->next!=NULL) {=begin->next;

}{=NULL;

}temp;

};

// удаление целевого элементаdel_2 (int idata) {elem* curr;elem* temp;=begin;=search_elem(idata);((curr->next!=temp)&&(curr->next!=NULL)) {=curr->next;

};>next=temp->next;(temp==begin) {=begin->next;

}temp;

};

// просмотр стeкawrite_lifo() {elem* curr;=begin;next;

}<< KONEC << endl;

};

// сортировкаelem* find_max (struct elem* curr) {elem* max=curr;{(curr->data>max->data) {=curr;

}=curr->next;

} while (curr!=NULL);max;

};sort_lifo() {elem *max, *curr, *temp, *ntemp;=begin;{=find_max(curr);(max!=curr) {=curr;(max!=begin) {((temp->next!=max)&&(temp->next!=NULL)) {=temp->next;

};};>next=max->next; // убрали мах из стека=begin;((temp->next!=curr)&&(temp->next!=NULL)) {=temp->next;

};(temp->next!=NULL) {>next=max;>next=curr;

} else

{>next=curr;=max;

}

// нашли и сменили элемент=max;

}=curr->next;

} while (curr->next!=NULL);

};

} mlifo;

// создаем стекc_lifo() {i=0, t;.create_lifo();{ t;++;.set(t);

} while (t!=0);

};add_elem() {t; t;.set(t);

}del_elem() {t; t;.del_2 (t);

};main()

{i;flag=true;{

>i;(i){1:c_lifo();break;2:add_elem();break;3:mlifo.del_1();break;4:mlifo.write_lifo();break;5:del_elem();break;6:mlifo.sort_lifo();break;0:flag=false;break;">_flushall();i;(i) {1: c_lifo(); break;2: add_elem(); break;3: mlifo.del_1 (); break;4: mlifo.write_lifo(); break;5: del_elem(); break;6: mlifo.sort_lifo(); break;0: flag=false; break;

};

} while(flag); 0;

}

 

Контрольные вопросы

) C++ ссылка - это простой ссылочный тип, менее мощный, но более безопасный, чем указатель, унаследованый от языка Си.

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

) new - оператор, обеспечивающий выделение динамической памяти в куче. За исключением формы, называемой размещающей формой new, new пытается выделить достаточно памяти в куче для размещения новых данных и, в случае успеха, возвращает адрес свежевыделенной памяти. Однако, если new не может выделить память в куче, то он передаст (throw) исключение типа std:bad_alloc. Это устраняет необходимость явной проверки результата выделения._var = new typename;

) В языке программирования C++ оператор delete возвращает память, выделенную оператором new, обратно в кучу. Вызов delete должен происходить для каждого вызова new, дабы избежать утечки памяти. После вызова delete объект, указывающий на этот участок памяти, становится некорректным и не должен больше использоваться. Многие программисты присваивают 0 (нуль-указатель) указателям после использования delete, чтобы минимизировать количество ошибок программирования. Однако нужно отметить, что удаление нуль-указателя фактически не имеет эффекта, так что нет необходимости проверять нуль-указатель перед вызовом delete*p_var = NULL; // объявление нового указателя_var = new int; // память динамически выделяется

/*…….

остальной кодp_var; // память освобождается_var = NULL; // указатель заменяется на 0 (нуль-указатель)

 

Лабораторная работа №4

Тема: Реализация одиночного наследования