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

1 ... 34 35 36 [ 37 ] 38 39 40 ... 227


cost = 123.23; thi3->cost= 123.23;

На самом деле первая форма - это сокращенная запись второй.

Пока рное, еще не родился программист который бы использовал

указатель this для доступа к членам класса так, как было показано, поскольку сокращенная форма намного проще, но здесь важно понимать, что под этим сокращением подразумевается.

Использовать указатель this можно no-разному. Он особенно полезен при перегрузке операторов. Такое его применение более подробно будет изучаться в главе 6. На данный момент важно то, что по умолчанию всем функциям-членам автоматически передается указатель на вызывающий объект.

УпраАнени!

1. Дана следующая программа, переделайте все соответствующие обращения к членам класса так, чтобы в них явно присутствовал указатель this.

ftinclude <iostreain>

using namespace std; .

class myclass {

int a, b; public:

myclass (int n, int m) { a - n; b = m; } in d() { return a + b; } void show () ; 1; .- .

void myclass::show(); int t;

t ; вызов функции-члена

cou t \n ;

int main

myclass ob(10, 14);

ob.show () ;

return 0; i



4.4. Операторы new и delete

До сих пор при выделении динамической памяти вы использовали функцию mallocO, а при освобождении памяти - функцию free(). Вместо этих стандартных функций в C++ стал применяться более безопасный и удобный способ выделения и освобождения памяти. Выделить память можно с помощью оператора new, а освободить ее с помощью оператора delete. Ниже представлена основная форма этих операторов:

p-var = new type; delete p-vax;

Здесь type ~ это спецификатор типа объекта, для которого вы хотите выделить память, ap-var - указатель на этот тип. New - это оператор, который возвращает указатель на динамически выделяемую память, достаточную для хранения объекта типа type. Оператор delete освобождает эту память, когда в ней отпадает необходимость. Вызов оператора delete с неправильным указателем может привести к разрушению системы динамического выделения памяти и возможному краху программы.

Если свободной памяти недостаточно для выполнения запроса, произойдет одно из двух: либо оператор new возвратит нулевой указатель, либо будет сгенерирована исключительная ситуация. (Исключительные ситуации и обработка исключительных ситуаций описываются далее в этой книге. Коротко об исключительной ситуации можно сказать следующее - это динамическая ошибка, которую можно обработать определенным образом.) В соответствии с требованиями языка Standait С++ по умолчанию оператор new должен генерировать исключительную ситуацию при невозможности удовлетворить запрос на выделение памяти. Если ваша программа не обрабатывает эту исключительную ситуацию, выполнение программы прекращается. К сожалению, точные требования к тому, какие действия должны выполняться, если оператор new не в состоянии удовлетворить запрос на выделение памяти, за последние годы менялись несколько раз. Поэтому вполне возможно, что в вашем компиляторе реализация оператора new выполнена не так, как это предписано стандартом Standart C++.

Когда C++ только появился, при невозможности удовлетворить запрос на выделение памяти оператор new возвращал нулевой указатель. В дальнейшем эта ситуация изменилась, и при неудачной попытке выделения памяти оператор new стал генерировать исключительную ситуацию. В конце концов было принято решение, что при неудачной попытке выделения памяти оператор new будет генерировать исключительную ситуацию по умолчанию, а возвращение нулевого указателя останется в качестве возможной опции. Таким образом, реализация оператора new оказалась разной у разных производителей компиляторов. К примеру, во время написания этой книги в компиляторе Microsoft Visual C++ при невозможности удовлетворить запрос на выделение памяти оператор new возвращал нулевой указатель, а в компиляторе Borland C++ генерировал исключительную ситуацию. Хотя в буду-



В языке С при присваивании указателю возвращаемого функцией malloc() значения не требуется приведение типов, поскольку тип void (тип возвращаемого функцией mallocf) указателя) автоматически преобразуется в тип.

щем во всех компиляторах оператор new будет реализован в соответствии со стандартом Standart С++, в настоящее время единственным способом узнать, какие именно действия он выполняет при неудачной попытке выделить палшгь, является чтение документации на компилятор.

Поскольку имеется два возможных способа, которыми оператор new может сигнализировать об ошибке выделения памяти, и поскольку в разных компиляторах он может быть реализован по-разному, в примерах программ этой книги сделана попытка удовлетворить оба требования. Во всех примерах значение возвращаемого оператором new указателя проверяется на равенство нулю. Такое значение указателя обрабатывается теми компиляторами, в которых при неудачной попытке выделить память оператор new возвращает нуль, хотя никак не влияет на те, в которых оператор new генерирует исключительную ситуацию. Если в вашем компиляторе во время выполнения программы при неудачной попытке выделить память оператор new сгенерирует исключительную ситуацию, то такая программа просто завершится. В дальнейшем, когда вы ближе познакомитесь с обработкой исключительных ситуаций, мы вернемся к оператору new, и вы узнаете, как лучше обрабатывать неудачные попытки выделения памяти. Вы также узнаете об альтернативной форме оператора new, который при наличии ошибки всегда возвращает нулевой указатель.

И последнее замечание: ни один из примеров программ этой книги не должен вести к ошибке выделения памяти при выполнении оператора new, поскольку в каждой конкретной программе выделяется лишь считанное число

байтов.

Хотя операторы new и delete выполняют сходные с функциями malloc() и

задачи, они имеют несколько преимуществ перед ними. оператор new автоматически выделяет требуемое для хранения объекта заданного типа количество памяти. Вам теперь не нужно использовать например, для подсчета требуемого числа байтов. Это уменьшает вероятность ошибки. Во-вторых, оператор new автоматически возвращает указатель на заданный тип данных. Вам не нужно выполнять приведение типов, операцию, которую вы делали, когда выделяли память, с помощью maUocO (см. следующее замечание). В-третьих, как оператор new, так и оператор delete можно перегружать, что дает возможность простой реализации

вашей собственной, привычной модели распределения памяти. В-четвертых,

допускается инициализация объекта, для которого динамически выделена память. Наконец, больше нет необходимости включать в ваши программы заголовок



1 ... 34 35 36 [ 37 ] 38 39 40 ... 227

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