Студопедия

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

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

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






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






     

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

    В листинге 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 :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.