Читайте также:
|
|
Битовые поля
Битовые поля — это особый вид полей структуры. Они используются для плотной упаковки данных, например, флажков типа «да/нет». При описании битового поля после имени через двоеточие указывается длина поля в битах (целая положительная константа):
struct Options {bool centerX:1;bool centerY:1;unsigned int shadow:2;unsigned int palette:4;};Доступ к полю осуществляется по имени. Адрес поля получить нельзя.
14. Конструктор и деструктор, их свойства (С++).
В каждом классе должен быть хотя бы один метод, который предназначен для инициализации объекта - конструктор.
Его имя совпадает с именем класса, и он вызывается автоматически при инициализации объекта.
Автоматический вызов конструктора позволяет избежать ошибок, связанных с использованием неинициализированных переменных.
Существует три типа конструкторов:
• конструктор с параметрами, используется для инициализации объекта требуемыми значениями;
• конструктор без параметров, используется для создания «пустого» объекта;
• конструктор копирования, используется для создания объекта, аналогичного тому, который уже существует.
Конструктор без параметров и конструктор копирования создаются по умолчанию.
Основные свойства конструкторов:
• Конструктор не возвращает значение, даже типа void.
• Нельзя получить указатель на конструктор.
• Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации (при этом используется механизм перегрузки).
• Конструктор, вызываемый без параметров, называется конструктором по умолчанию.
• Параметры конструктора могут иметь любой тип, кроме этого же класса.
• Если программист не указал ни одного конструктора, компилятор создает его автоматически. Такой конструктор вызывает конструкторы по умолчанию для полей класса. В случае, когда класс содержит константы или ссылки, при попытке создания объекта класса будет выдана ошибка, поскольку их необходимо инициализировать конкретными значениями, а конструктор по умолчанию этого делать не умеет.
Конструктор копирования — это специальный вид конструктора, получающий в качестве единственного параметра указатель на объект этого же класса
Этот конструктор вызывается в тех случаях, когда новый объект создается путем копирования существующего:
1. при описании нового объекта с инициализацией другим объектом;
2. при передаче объекта в функцию по значению;
3. при возврате объекта из функции.
Если программист не указал ни одного конструктора копирования, компилятор создает его автоматически. Такой конструктор выполняет поэлементное копирование полей.
3 случая вызова конструктора копирования
1. при описании нового объекта с инициализацией другим объектом;
2. при передаче объекта в функцию по значению;
//объект передается по значению
void print_person(person a)
{a.print();}
3. при возврате объекта из функции;
//объект передается по значению
person set_inf()
{person s;//создается временный объект
s.set_person("Sidorov",25);
//объект возвращается как значение функции
return s;}
class bibl
{ char* name, avtor;
float stoim;
public:
bibl();//конструктор без параметра
bibl (char*, float);//конструктор с параметром
bibl(const bibl&);//конструктор копирования
Вызывается конструктор так:
bibl k1("Айвенго", 400); // вызов конструктора с параметрами
cout << k1.Getname() <<k1.Getavtor() <<k1.Getstoim()<<endl;; // вывод значений на монитор
bibl k2; // вызов конструктора без параметров
k2.Setname("Клеймо"); // заполнение поля name
k2.Setavtor("Петров"); // заполнение поля kol
k2.Setstoim(250); // заполнение поля stoim
cout << k2.Getname()<<k2.Getavtor() <<k2.Getstoim()<<endl;// вывод значений на монитор
bibl k3 = k2; // вызов конструктора копирования
• Деструктор – это особый вид метода, применяющийся для освобождения ресурсов, выделенных конструктором объекту. Деструктор вызывается автоматически, когда объект удаляется из памяти:
– для локальных объектов это происходит при выходе из блока, в котором они объявлены;
– для глобальных — при выходе из main;
– для динамических объектов деструктор вызывается неявно при использовании операции delete.
• Имя деструктора начинается с тильды (~), непосредственно за которой следует имя класса:
~person()
Свойства деструктора:
• не имеет аргументов и возвращаемого значения;
• не наследуется;
• не может быть объявлен как const или static;
• может быть виртуальным.
• Если деструктор явным образом не определен, компилятор автоматически создает пустой деструктор.
• Описывать в классе деструктор явным образом требуется в случае, когда объект содержит указатели на память, выделяемую динамически — иначе при уничтожении объекта память, на которую ссылались его поля -указатели, не будет помечена как свободная.
• Указатель на деструктор определить нельзя.
• Деструктор для рассматриваемого примера будет выглядеть так:
person::~person() {delete [] name;}
• Явно вызывать деструктор объекта не рекомендуется.
15. Типы данных, определяемые пользователем: объединения.
Объединение отличается от структуры тем, что в его полях могут храниться разные данные.
Для каждого поля указывается его размер в битах, обычно объем занимаемой памяти кратен 8(1 байт) битам.
Битовые поля используются для хранения установочных файлов.
Битовое поле
Перечисляемый тип – enum
enum <имя типа>{<список констант, переменных>};
например, enum Err{two=2, three,...};
Этот тип применяется при организации объединения.
Пусть union – объединение созданное для хранения информации о платёжном документе (карта\чек). При этом карта- символьный тип, а чек – целый.
Поэтому для описания создаём структуру:
enum tpay{card,chek};
<начало типа>
struct {tpay pay;
union{char card[25];long int chek};
}; <конец типа> info<переменная>;
int main()
{... switch (info.pay) //вывести по какому документу оплачивается
{case card: cout<<card<<endl;
Case chek: cout<<chek<<endl;};
}
16. Конструктор и деструктор, их свойства (Паскаль).
17. Функции. Объявление и определение, заголовочные файлы в С и предописания (forward) в Паскале.
Функция — это именованная последовательность описаний и операторов, выполняющая какое-либо законченное действие. Функция может принимать параметры и возвращать значение.
С помощью функций задача может быть разделена на более простые и обозримые, после чего программу можно рассматривать в более укрупненном виде — на уровне взаимодействия функций. Использование функций является первым шагом к повышению степени абстракции программы и ведет к упрощению ее структуры.
Разделение программы на функции позволяет также избежать избыточности кода, поскольку функцию записывают один раз, а вызывать ее на выполнение можно из разных точек программы многократно.
Процесс отладки программы, содержащей функции, можно лучше структурировать. Часто используемые функции можно помещать в библиотеки. Таким образом создаются более простые в отладке и сопровождении программы.
Любая программа на С++ состоит из функций, одна из которых должна иметь имя main(с нее начинается выполнение программы).
Функция начинает выполняться в момент вызова. Любая функция должна быть объявлена и определена. Как и для других величин, объявлений может быть несколько, а определение только одно.
Объявление функции должно находиться в тексте раньше ее вызова для того, чтобы компилятор мог осуществить проверку правильности вызова.
Объявление функции (прототип, заголовок, сигнатура) задает ее имя, тип возвращаемого значения и список передаваемых параметров.
Определение функции содержит, кроме объявления, тело функции, представляющее собой последовательность операторов и описаний в фигурных скобках:
[ класс ] тип имя ([ список_параметров ])[throw (исключения)]
{ тело функции }
Рассмотрим составные части определения.
extern — глобальная видимость во всех модулях программы (по умолчанию);static — видимость только в пределах модуля, в котором определена функция.
В определении, в объявлении и при вызове одной и той же функции типы и порядок следования параметров должны совпадать.
На имена параметров ограничений по соответствию не накладывается.
Функцию можно определить как встроенную с помощью модификатора inline, который рекомендует компилятору вместо обращения к функции помещать ее код непосредственно в каждую точку вызова. Модификатор inlineставится перед типом функции. Он применяется для коротких функций, чтобы снизить накладные расходы на вызов.
Директива inline носит рекомендательный характер и выполняется компилятором по мере возможности.
Тип возвращаемого значения и типы параметров совместно определяют тип функции.
Для вызова функции в простейшем случае нужно указать ее имя, за которым в круглых скобках через запятую перечисляются имена передаваемых аргументов.
Вызов функции может находиться в любом месте программы, где по синтаксису допустимо выражение того типа, который формирует функция. Если тип возвращаемого функцией значения не void, она может входить в состав выражений или, в частном случае, располагаться в правой части оператора присваивания.
Все величины, описанные внутри функции, а также ее параметры, являются локальными. Областью их действия является функция. При вызове функции, как и при входе в любой блок, в стеке выделяется память под локальные автоматические переменные.
При выходе из функции соответствующий участок стека освобождается, поэтому значения локальных переменных между вызовами одной и той же функции не сохраняются. Если этого требуется избежать, при объявлении локальных переменных используется модификатор static:
Дата добавления: 2015-02-16; просмотров: 32 | Поможем написать вашу работу | Нарушение авторских прав |