Программирование >>  Дополнительные возможности наследования 

1 ... 78 79 80 [ 81 ] 82 83 84 ... 265


Для решения этой проблемы есть три пути. Первый состоит в объявлении объекта класса SimpleCat в строке 28 и возврашении этого объекта из функции TheFunction как значения. Второй - в объявлении класса SimpleCat в свободной области (в теле функции TheFunctionO), но сделать это нужно так, чтобы функция TheFunction() возврашала указатель на данный объект. Затем, когда объект больше не нужен, его можно удалить в вызывающей функции с помощью оператора delete.

Третье решение (возможно, самое правильное) - объявить объект в вызывающей функции, а затем передать в функцию TheFunction()ссылку на него.

А где же указатель?

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

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

Весьма небезопасно, если одна функция создает объект с въщелением для него некоторой памяти, а другая занимается освобождением этой памяти. Неопределенность относительно владельцев указателя может привести к одной из двух проблем: можно забыть освободить память или применить оператор delete дважды к одному и тому же указателю. Любая из этих проблем может стать причиной больших неприятностей в вашей программе. Именно поэтому целесообразно придерживаться принципа, что память освобождает та функция, которая ее зарезервировала.

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

Рекомендуется

Нв рекоменууется

Передавайте параметры функции как значения только тогда, когда в этом есть необходимость.

Возвращайте результат работы функции как значение только тогда, когда в этом есть необходимость.

Не используйте ссылки на объекты, которые могут выйти в программе за пределы области видимости. Не создавайте ссылки на нулевые объекты.

Резюме

Сегодня вы узнали, что представляют собой ссылки и чем они отличаются от указателей. Важно уяснить для себя, что ссылки всегда инициализируют существующие объекты и их нельзя переназначить до окончания программы. Ссылка выступает псевдонимом объекта, и любое действие, выполненное над ссылкой, выполняется над ее адресатом. Доказательством этого может служить тот факт, что при взятии адреса ссылки возвращается адрес связанного с ней объекта.



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

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

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

Вопросы U ответы

Зачем использовать ссылки, если указатели могут делать ту же работу?

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

Зачем нужны указатели, если со ссылками легче работать?

Ссылки не могут быть нулевыми, и их нельзя переназначать. Указатели предлагают больщую гибкость, но их сложнее использовать.

Зачем вообще результат функции возвращать как значение?

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

Если существует опасность от возвращения объекта как ссылки, почему бы тогда не сделать обязательным возврат по значению?

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

Коллоквиум

в этом разделе предлагаются вопросы для самоконтроля и укрепления полученных знаний, а также ряд упражнений, которые помогут закрепить ваши практические навыки. Попытайтесь самостоятельно ответить на вопросы теста и выполнить задания, а потом сверьте полученные результаты с ответами в приложении Г. Не приступайте к изучению материала следующей главы, если для вас остались неясными хотя бы некоторые из предложенных ниже вопросов.

Контрольные еопросы

1. в чем разница между ссылкой и указателем?

2. Когда нужно использовать именно указатель, а не ссылку?

3. Что возвращает оператор new, если для создания нового объекта недостаточно памяти?

4. Что представляет собой константная ссылка?

5. В чем разница между передачей объекта как ссылки и передачей ссылки в функцию?



Уоражненпя

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

2. Напишите программу, которая объявляет константный указатель на постоянное целое значение. Инициализируйте этот указатель, чтобы он указывал на целочисленную переменную varOne. Присвойте переменной varOne значение 6. Используйте указатель, чтобы присвоить переменной varOne значение 7. Создайте вторую целочисленную переменную varTwo. Переназначьте указатель, чтобы он указывал на переменную varTwo. Пока не компилируйте это упражнение.

3. Скомпилируйте программу, написанную в упражнении 2. Какие действия компилятор считает ошибочными? Какие строки генерируют предупреждения?

4. Напишите программу, которая создает блуждаюший указатель.

5. Исправьте программу из упражнения 4, чтобы блуждающий указатель стал нулевым.

6. Напишите программу, которая приводит к утечке памяти.

7. Исправьте программу из упражнения 6.

8. Жучки: что неправильно в этой программе?

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

#include <iostream.h>

class CAT {

public:

CAT(int age) { itsAge = age; } CAT(){ }

int GetAgeO const { return itsAge;} private:

int itsAge;

CAT & MakeCat(int age);

int mainO

int age = 7;

CAT Boots = MakeCat(age);

cout Boots is Boots.GetAgeO years old!\n ; return 0;

CAT & MakeCat(int age) {

CAT . pCat = new CAT(age); return *pCat;

9. Исправьте программу из упражнения 8.



1 ... 78 79 80 [ 81 ] 82 83 84 ... 265

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