o new[] выделяет чуть больше памяти чем нужно для размещения всех элементов массива – дополнительно хранится информация о размере массива
int a[] = new int[10];
delete a; //Неправильно! Удалится только a[0]
delete[] a; //Правильно!
o безопасно вызывать delete на нулевом указателе
int *p = 0;
delete p; //Ok!
delete[] p; //Ok!
o при создании массива вызываются конструкторы по умолчанию для всех элементов массива.
o при удалении массива вызываются деструкторы для всех элементов массива
Порядок вызова конструкторов и деструкторов
Конструкторы вызываются в том же самом порядке, в каком классы следуют один за другим в иерархии классов. Поскольку базовый класс ничего не знает про свои производные классы, то его инициализация может быть отделена от инициализации производных классов и производится до их создания, так что конструктор базового класса вызывается перед вызовом конструктора производного класса.
В противоположность этому деструктор производного класса вызывается перед деструктором базового класса. Причину этого также легко понять. Поскольку уничтожение объекта базового класса влечет за собой уничтожение и объекта производного класса, то деструктор производного объекта должен выполняться перед деструктором базового объекта.
Варианты реализации отношения клиент-сервер. Объекты при передаче параметров и возврате из методов.
Для того, чтобы объект-клиент мог вызвать метод объекта-сервера, необходимо, чтобы сервер был видим для клиента, и клиент должен знать о контракте, предоставляемом сервером. Информация о контракте задается типом (классом или интерфейсом абстракцией) переменной (ссылки, указателя), через которую сервер доступен клиенту.
Существуют четыре способа обеспечения видимости:
• Сервер имеет глобальную видимость по отношению к клиенту
• Сервер передан клиенту в качестве параметра операции (метода)
• Сервер является частью клиента
• Сервер локально порождается клиентом в ходе выполнения какой-либо операции
В С++ видимость может быть обеспечена с помощью именованных типизированных переменных, ссылок или указателей, которые могут быть глобальными, локальными, статическими, или являться параметрами методов; либо с помощью типизированных значений lvalue.
Объекты можно передавать функциям в качестве аргументов так же, как передаются данные других типов. Для этого объявляют параметр функции, как имеющий тип класса, и затем используется объект этого класса в качестве аргумента при вызове функции. Как и для данных других типов, по умолчанию объекты передаются по значению. Это означает, что внутри функции создается копия аргумента и эта копия, а не сам объект, используется функцией. Поэтому изменение копии объекта не влияет на сам объект.
Как и в случае с перемещением других типов, функции может быть передано не значение объекта, а его адрес. В этом случае функция может изменить значение аргумента, использованное в вызове. Если при передаче объекта в функцию делается его копия, это означает, что появляется новый объект.
Когда работа функции, которой был передан объект, завершается, то копия аргумента удаляется.
12. Исключения в C++. Обработка исключений. Умные указатели.
Исключения в Си плас плас
Концепция
Выброс и перехват исключений предоставляет возможность передавать информацию и контроль исполнения из определенной точки программы перехватчику, определенному в точке через которую ранее прошел поток исполнения, в т.ч. и в вызвавшую функцию (т.е. сквозь стек вызовов)
o Исключение может быть вызвано явно (throw) из какой-либо функции, либо в результате нарушения семантики языка (dynamic_cast, typeid)
o Чтобы быть перехваченным исключение должно выбрасываться изнутри try блока или функции вызванной из try блока который имеет подходящий по типу catch блок перехвата
o Исключения следует наследовать от std::exception
Когда бросать?
Выброс исключения используется для сигнализирования об ошибках при вызове функции при следующих обстоятельствах:
o Невозможно удовлетворить «постусловия» работы функции, в т.ч. вернуть допустимый результат
o Невозможно выполнить «предусловия» другой функции, которая должна быть вызвана из текущей
o Для функций-членов, не являющихся private: невозможно установить или соблюсти «инвариант» объекта(???)
Это означает, что ошибки в конструкторах и операторах как правило сигнализируются с помощью выброса исключений.
Функции могут сигнализировать об ошибках исключениями при передачи им некорректных аргументов.
Дата: 2019-02-19, просмотров: 241.