Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Если программист не указал ни одного конструктора копирования, компилятор создает его автоматически. Такой конструктор выполняет поэлементное копирование полей.

Читайте также:
  1. V. Основные направления развития международного сотрудничества
  2. V2: Патофизиология углеводного обмена
  3. Альным взаимодействием. Вот почему эту качественно новую ступень природного феномена следует выделить как социальный импринтинг.
  4. Б. Обязательства, возникавшие вследствие неосновательного обогащения одного лица за счет другого.
  5. Баланс рабочего времени одного среднесписочного рабочего
  6. Безналичные расчеты подразделяются на одногородние (местные) и иногородние.
  7. Билет №9. Правовая система РФ, значение в ней принципов и норм международного права и международных договоров.
  8. Билет. Основные тенденции международного туризма в современности
  9. Борьба с международными преступлениями и преступлениями международного характера.
  10. Бытие человека как центральная проблема философии. Диалектика природного и социального в человеке.

Битовые поля

Битовые поля — это особый вид полей структуры. Они используются для плотной упаковки данных, например, флажков типа «да/нет». При описании битового поля после имени через двоеточие указывается длина поля в битах (целая положительная константа):

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 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.013 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав