Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 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; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию