Программирование >>  Программирование на языке c++ 

1 ... 68 69 70 [ 71 ] 72 73 74 ... 159


public:

Ptr* operator->{) { return this; } доопределение -> Ptr& operator*() { return *this; } доопределение * Ptr& operator[](int i) { return this[i]; } доопределение [] void displayO { cout << Class Ptr\n ; } компонент-

функция

void main(void) { Ptrp;

p->display(); Результат: Class Ptr

(*p).displayO; Результат: Class Ptr

p[0].displayO; Результат: Class Ptr

p.displayO; , Результат: Class Ptr

Здесь использованы четыре способа доступа к компоненту displayO класса Ptr, из которых последний является стандартным. Во всех четырех случаях результаты будут одинаковыми.

5.9. Переопределение операторов new и delete

Различают глобальные и локальные операторы new и delete. Глобальные операторы определены за пределами классов и в общем случае могут не иметь аргументов (операндов) типа класс . Локальные операторы определены в классе, относительно которого они и являются локальными. Операторы new и delete имеют свои собственные правила переопределения, отличающиеся от рассмотренных выше правил переопределения других операторов.

Глобальные операторы new задаются в следующих формах (ниже полное имя с префиксом :: используется лишь тогда, когда необходимо отличить глобальный оператор от локального; во всех остальных случаях префикс :: можно опустить): ::operator new() для не массивов ::operator new[]() для массивов Эти операторы могут быть доопределены. При этом появляется несколько глобальных операторов, один из которых оп-



ределен в самом языке по умолчанию, а другие являются доопределениями пользователей. Возникает вопрос: как различать такие операторы? Это делается путем изменения числа и(или) типов их аргументов. При изменении только типов аргументов может возникать неоднозначность, являющаяся следствием возможных преобразований этих типов друг к другу. Однако при возникновении такой неоднозначности следует задать тип явно при обращении к доопределенному оператору new, например new( (float)5 ) double (здесь явно указан тип float).

Глобальный оператор new можно задать в следующих формах:

<::> new < аргументы > имя типа

<инициализирующее выражение> <::> new < аргументы > имя типа [ ]

где в угловых скобках заданы необязательные параметры. Параметр аргументы можно вводить для того, чтобы различить разные глобальные операторы new (выше говорилось, что разрешается одновременно иметь несколько версий таких операторов). Конечно, аргументы могут быть использованы и в теле новой функции operator. Если аргументы опустить, то будет изменен глобальный оператор new, заданный в языке по умолчанию. Доопределенную функцию operator new можно объявить в таких формах:

void* operator

new(size t t [,аргументы разделенные запятыми]);

void* operator

new[ ](size t t [,аргументы разделенные запятыми]);

Первая форма используется для не массивов, а вторая - для массивов. Возвращаемое значение всегда должно иметь тип void* (указатель на неопределенный тип). Первый и единственный обязательный аргумент t функции всегда должен иметь тип size t. Если аргумент t имеет тип size t, то в функцию operator new автоматически поставляется аргумент sizeof(t), т. е. она получит значение, равное размеру объекта типа t в байтах. Пусть задана следующая глобальная функция operator new:

void* operator new(size t t,int n) { return new char[t*n]; }



И она вызывается следующим образом (п=5, t=double): double *d=new(5) double;

В результате после вызова значение t в теле функции будет равно sizeof(double)=8 (значение 8 взято для персональных компьютеров).

Рассмотрим еще одну функцию operator:

void* operator new(size t t,int n.int m)

Теперь в выражении float *a=new(3,2) float; будет вызвана функция operator new(sizeof(float),3,2).

Рассмотрим пример, демонстрирующий доопределение глобальной функции new.

#include <iostream.h>

#include <alloc.h> здесь содержится описание типа size t struct А { размер структуры типа А равен 6 байт (для PC)

int аа;

int bb;

int cc; };

void* operator new(size t t,int n) функция с одним

дополнительным аргументом (версия 1) { cout 1: << t*n endl; индицирует вызов этой

функции

return new char[t*n]; } какое-то вьщеление памяти void* operator new(size t t,int n,int m) функция с двумя

дополнительными аргументами (версия 2) { cout 2: t*n*m endl; индицирует вызов

функции

return new char[t*n*m]; } какое-то выделение памяти void main(void)

{ double *d=new(5) double; Версия 1. Результат: 1: 40 A *a=new(3,2) A; Версия 2. Результат: 2: 36

long *l=new long; Глобальная (заданная в языке по умолчанию) версия

здесь можно выполнять какие-то действия delete d; delete а;



1 ... 68 69 70 [ 71 ] 72 73 74 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика