Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы Осадчий А.В. гр.010902.docx
Скачиваний:
6
Добавлен:
24.04.2019
Размер:
143.34 Кб
Скачать

55. Ключевое слово ехрlicit.Ключевое слово mutable

Explicit

Explicit -это ключевое слово используется для запрещения создания конвертирующего конструктора. пример:

class String {

public:

String (int n);//выделить n байт для создания объекта

String(const char *p); // инициализировать объект из C-строки

}

При этом если выполнить следующий код:

String s = 'x';

то 'x' преобразуется в int и будет вызван конструктор String(int). Это совсем не то поведение, которое можно было бы ожидать. Для избежания таких ситуаций и используется ключевое слово explicit:

class String {

public:

explicit String (int n);//выделить n байт для создания объекта

String(const char *p); // инициализировать объект из C-строки

}

class String {

public:

explicit String (int n);//выделить n байт для создания объекта

String(const char *p); // инициализировать объект из C-строки

}

Таким образом, объявление конструктора с одним аргументом (или с несколькими аргументами, где все, кроме первого имеют значения по умолчанию) explicit гарантирует неиспользование его в качестве оператора приведения типа.

Mutable

Константная функция-элемент “обещает” не изменять значений элементов данных класса, что позволяет применять ее на константных объектах. Тем не менее, в некоторых ситуациях имеет смысл разрешить некоторым элементам меняться даже у константных объектов. Например, некоторый существенный набор данных изменять ни в коем случае нельзя, в то время как отдельный элемент, скажем, некоторое сообщение, может и должно меняться. В этом случае можно объявить элемент данных с ключевым словом mutable:

class AnyClass {

int value;

mutable const char *msg;

public.:

AnyClass (): value (0), msg(NULL) {}

int GetValueO const;

// ... };

int AnyClass::Get Value() const

{

msg - "New message!";

// Допускается, поскольку msg - mutable.

// value изменять нельзя:

// value = 111;

return value;

}

Модификатор mutable не может применяться совместно с const или static (в приведенном примере все верно, поскольку const относится не к msg, а к содержимому строки, на которую он ссылается).

56. Классы-контейнеры и классы-итераторы

К наиболее популярным типам классов относятся классы, контейнеры (называемые также классы совокупностей), т.е. классы, спроектированные для хранения в них совокупностей объектов. Классы контейнеры обычно снабжены такими возможностями, как вставка, удаление, поиск, сортировка, проверка наличия элемента в классе и тому подобное. Массивы, стеки, очереди, связные списки — все это примеры классов контейнеров.

Принято ассоциировать объекты итераторы, или, короче — итераторы, с классами контейнерами. Итератор — это объект, который возвращает следующий элемент совокупности (или определяет некоторое действие над следующим элементом совокупности). Когда написан итератор класса, легко получить следующий элемент этого класса. Итераторы обычно пишутся как друзья классов, с которыми они работают. Это предоставляет итераторам возможность прямого доступа к закрытым данным этих классов. Подобно тому, как книга, читаемая несколькими людьми, могла бы иметь в себе сразу несколько закладок, класс контейнер может иметь несколько одновременно работающих итераторов. Каждый итератор поддерживает свою собственную «позицию» информации.

Пример:

#include <iterator>

// type - имя типа элементов с которыми будет работать итератор

class MyIterator:

public std::iterator

<std::forward_iterator_tag, type> {

...

};