Выделение памяти под массивы
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

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.