Студопедия

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

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Не возвращайте ссылку на объект, который находиться вне области видимости!






 

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

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

Листинг 9.13. Возвращение ссылки на несуществующий объект

1: // Листинг 9.13.

2: // Возвращение ссылки на объект,

3: // которого больше не существует

4:

5: #include < iostream.h>

6:

7: class SimpleCat

8: {

9: public:

10: SimpleCat (int age, int weight);

11: ~SimpleCat() { }

12: int GetAge() < return itsAge; }

13: int GetWeight() { return itsWeight; }

14: private:

15: int itsAge;

16: int itsWeight;

17: };

18:

19: SimpleCat:: SimpleCat(int age, int weight)

20: {

21: itsAge = age;

22: itsWeight = weight;

23: }

24:

25: SimpleCat & TheFunction();

26:

27: int main()

28: {

29: SimpleCat & rCat = TheFunction();

30: int age = rCat.GetAge();

31: cout < < " rCat " < < age < < " years old! \n"

32: return 0;

33: }

34:

35: SimpleCat & TheFunction()

36: {

37: SimpleCat Frisky(5, 9);

38: return Frisky;

39: }

 

Результат:

Compile error: Attempting to return a reference to a local object! (Ошибка компиляции: попытка возвратить ссылку на локальный объект!)

 

Предупреждение: Эта программа не компилируется на компиляторе фирмы Borland, но для нее подходят компиляторы компании Microsoft. Однако профессиональный программист никогда не станет полагаться на уступки компилятора.

 

Анализ: В строках 7—17 объявляется класс SimpleCat. В строке 29 инициализируется ссылка на объект класса SimpleCat с использованием результатов вызова функции TheFunction(), объявленной в строке25. Согласно объявлению эта функция возвращает ссылку на объект класса SimpleCat.

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

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

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.