Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Перегрузка операций new и delete
Различают глобальные и локальные операторы new и delete. 1. Глобальные операторы определены за пределами класса и в общем случае могут вообще не иметь аргументов типа «класс» (т.е. не быть член-функцией или дружественной функцией класса). 2. Локальные операторы определены в классе, относительно которого они и являются локальными. Предопределенный оператор new имеет следующие формы: operator new() //для не массивов operator new[] Прототипы этих функций: void *operator new(size_t sz); void *operator new[](size_t sz); Перегруженную операцию new можно задавать в следующих формах: 1. New <аргументы> имя_типа <инициализирующее выражение> // для не массивов 2. New <аргументы> имя_типа [] // для массивов Прототипы этих функций: void *operator new(size_t t, [аргументы]); void *operator new[](size_t, [аргументы]); Любая переопределенная функция new должна возвращать указатель на void и в качестве первого аргумента получать тип size_t (в этом случае в функцию operator new автоматически поставляется аргумент sizeof(t)). Пример. void *operator new(size_t, int); void *operator new[](size_t, int}; void main() {double *d=new (5) double; // n=5; t=double double *p=new (5) double[3]; // результат 120 байт } void *operator new(size_t t, int n) {return new char[t*n];} void *operator new[](size_t t, int n) {return new char[t*n];} Предопределенная операция delete имеет прототип void delete(void *p); При ее перегрузке необходимо, чтобы она возвращала значение void и в качестве первого (и обязательного) аргумента получала void * (указатель на объект или массив, j надо удалить). Операции new и delete можно переопределить локальными, при этом требования к определению new и delete сохраняются. Пример. class X {... public: void *operator new(size_t sz); void operator delete(void *p); X(); X(char ch); ~X(); }; При таком определении, если конструктор и деструктор динамически распределяют и освобождают память, то они будут использовать собственные операции new и delete, так как они имеют такую же область видимости, как и член-функции класса. Если операция new будет применена для создания объекта класса, будет вызвана перегруженная в этом классе операция: Пример. X *p=new X;//вызывается перегруженная операция new Чтобы вызвать стандартную операцию new или delete нужно использовать операцию расширения области видимости: Пример. X *pc=:: new X; // стандартный new :: delete pc; // стандартный delete Переопределенные операции new и delete наследуются в производных классах.
Ввод и вывод Библиотека ввода/вывода <iostream.h> - содержит две параллельных группы классов. 1) Главный базовый класс streambuf – обеспечивает организацию и взаимосвязь буферов ввода/вывода, размещаемых в памяти, с физическими устройствами ввода/вывода. Класс streambuf содержит средства для выполнения низкоуровневых операций ввода/вывода Рис. 6. Структура класса streambuf Функции этих классов используются классами второй группы. - класс conbuf – содержит функции, модифицирующие вывод данных на экран; - класс filebuf – управляет процессами выделения и освобождения буферов ввода/вывода при работе с файлами (низкоуровневые операции); - класс strstreambuf – управляет процессами выделения и освобождения буферов ввода/вывода при работе со строками (низкоуровневые операции). 2) Главный базовый класс ios – содержит средства для форматного ввода/вывода и проверки ошибок. Имена классов (рис. 7) назначены в соответствии со следующими правилами: ixxxx – содержит функции ввода данных; oxxxx – содержит функции вывода данных; fxxxx – содержит функции для работы с файлами; strxxxx – содержит функции для работы со строками; ifxxxx – содержит функции ввода данных из файлов; istrxxxx – содержит функции ввода данных из строк; ofxxxx – содержит функции ввода данных в файлы; ostrxxxx – содержит функции ввода данных в строки. Рис. 7. Структура класса ios Язык С++ не определяет ввод/вывод, но предопределяет широкий набор средств для его реализации. В С++ файл рассматривается как последовательность байтов, а набор функций библиотеки обеспечивает возможность обработки данных различных размеров и форматов. Ввод/вывод в С++ - это широкое использование перегрузки операций << и >>, поэтому можно вводить/выводить данные как встроенных так и пользовательских типов не применяя функцию printf с ее сложным форматом. Date: 2016-05-13; view: 377; Нарушение авторских прав |