Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
answer_1_20.docx
Скачиваний:
2
Добавлен:
29.09.2019
Размер:
311.21 Кб
Скачать

Алгоритм работы оператора присваивания

  • Вычислить левостороннее значение первого операнда. На этом этапе становится известным местонахождение целевого объекта, приёмника нового значения.

  • Вычислить правостороннее значение второго операнда. Этот этап может быть сколь угодно большим и включать другие операторы (в том числе присвоения).

  • Присвоить вычисленное правостороннее значение левостороннему значению. Во-первых, при конфликте типов должно быть осуществлено их приведение(либо выдано сообщение об ошибке ввиду его невозможности). Во-вторых, собственно присваивания значения в современных языках программирования может быть подменено и включать не только перенос значений ячеек памяти (например, в «свойства» объектов в C#, перегрузка операторов).

  • Возвратить вычисленное правостороннее значение как результат выполнения операции. Требуется не во всех языках (например, не нужно в Паскале).

Операция присваивания в языке программирования C++ обозначается знаком '='. Как и другие операторы в C++, она может быть перегружена.

Операция присваивания копированием - особый вид операции присваивания, используемый для присваивания объектов одного класса друг другу. Является одним из особых членов-функций и генерируется автоматически компилятором в случае, если нет явного объявления программистом. Код, сгенерированный компилятором, выполняет поверхностное копирование.

Операция присваивания копированием отличается от конструктора копирования тем, что должен очищать члены-данные цели присваивания (и правильно обрабатывать самоприсваивание), тогда как конструктор копирования присваивает значения неинициализированным членам-данным.[1] Например:

My_Array first; // инициализация конструктором по умолчанию

My_Array second = first; // инициализация конструктором копирования

second = first; // присваивание операцией присваивания копированием

Перегрузка операции присваивания копированием

Когда нужно сделать глубокие копии объектов необходимо также принять во внимание и обработку исключений. Одним из способов избежать ошибки перемещения ресурсов является следующий:

  1. Получаем новые ресурсы

  2. Освобождаем старые ресурсы

  3. Присваиваем объекту значения нового ресурса

class My_Array

{

int * array;

int count;

public:

My_Array & operator = (const My_Array & other)

{

if (this != &other) // защита от неправильного самоприсваивания

{

// 1: выделяем "новую" память и копируем элементы

int * new_array = new int[other.count];

std::copy(other.array, other.array + other.count, new_array);

// 2: освобождаем "старую" память

delete [] array;

// 3: присваиваем значения в "новой" памяти объекту

array = new_array;

count = other.count;

}

// по соглашению всегда возвращаем *this

return *this;

}

...

};

  1. Основні елементі об’єктної моделі. Інкапсуляція, управління доступом до членів класу. Категорії методів класу. Приклад об’явлення класу.

Вообще говоря, под инкапсуляцией понимается доступность объекта исключительно посредством его свойств и методов.

Инкапсуля́ция — свойство языка программирования, позволяющее объединить данные и код в объект и скрыть реализацию объекта от пользователя (прикладного программиста). При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью директив: public, private, protected.

Свойства инкапсуляции:

• совместное хранение данных и функций;

• сокрытие внутренней информации от пользователя;

• изоляция пользователя от особенностей реализации.

class A

{

private:

int a,b; //скрытые свойства

void DoSomething(); //скрытый метод.

public:

int ReturnSomething(); //открытый интерфейс

};

Класс А инкапсулирует свойства a, b и метод DoSomething, представляя внешний интерфейс ReturnSomething.

Доступ к членам класса

Управление доступом применяется единообразно к функциям-членам класса и данным-членам класса.

Член класса может быть:

  • приватным (private) – это значит, что его имя может употребляться лишь внутри функций-членов класса и друзей класса, в котором этот член класса объявлен;

  • защищённым (protected) – это значит, что его имя может употребляться лишь внутри функций-членов класса, друзей этого класса ипроизводных от него классов;

  • публичным (public) – это значит, что его имя может употребляться внутри любой функции (а также и вне функций в инициализаторах).

Модификаторы доступа можно использовать несколько раз в одном и том же объявлении класса.

Механизмы управления доступом в С++ обеспечивают защиту от случайного, а не от преднамеренного доступа. Однако это относится к проблемам дисциплины программирования, а не к проблемам языка.

Члены класса без спецификатора доступа по умолчанию являются приватными. Члены структур и объединений по умолчанию являются публичными.

Различают простые методы и статические методы (методы класса):

  • простые методы имеют доступ к данным объекта (конкретного экземпляра данного класса),

  • статические методы не имеют доступа к данным объекта и для их использования не нужно создавать экземпляры (данного класса).

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

В зависимости от того, какой уровень доступа предоставляет тот или иной метод, выделяют:

  • открытый (public) интерфейс — общий интерфейс для всех пользователей данного класса;

  • защищённый (protected) интерфейс — внутренний интерфейс для всех наследников данного класса;

  • закрытый (private) интерфейс — интерфейс, доступный только изнутри данного класса.

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

Определение (объявление) класса в языке C++ выглядит следующим образом:

class MyClass: public ParentClass // ParentClass — класс-предок, который должен быть определён ранее

{

public:

// элементы в этой секции доступны из любой части программы

MyClass(); // конструктор

~MyClass(); // деструктор

int classmember;

protected:

// элементы в этой секции доступны из класса и его потомков

private:

// элементы в этой секции доступны только из класса; это область доступа по умолчанию

};

  1. Графи. Приклад реалізації находження найкоротшого шляху в графі на об’єктно-орієнтованій мові програмування.

Граф - это двойка <V, E>, где V - непустое множество вершин, а Е - множество ребер, соединяющих эти вершины попарно2). Две вершины, связанные между собой ребром, равноправны, и именно поэтому такиеграфы называются неориентированными: нет никакой разницы между "началом" и "концом" ребра.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]