Примечание:
Не возвращайте ссылку на объект, который находиться вне области видимости!
Научившись передавать аргументы как ссылки на объекты, программисты порой теряют чувство реальности. Не стоит забывать, что все хорошо в меру. Помните, что ссылка всегда служит псевдонимом некоторого объекта. При передаче ссылки в функцию или из нее не забудьте задать себе вопрос: "Что представляет собой объект, псевдонимом которого я манипулирую, и будет ли он существовать в момент его использования?"
В листинге 9.13 показан пример возможной ошибки, когда функция возвращает ссылку на объект, которого уже не существует.
Листинг 9.13. Возвращение ссылки на несуществующий объект
1: // Листинг 9.13.
2: // Возвращение ссылки на объект,
3: // которого больше не существует
4:
5: #include
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! (Ошибка компиляции: попытка возвратить ссылку на локальный объект!)
Предупреждение:
Анализ:
В строках 7—17 объявляется класс SimpleCat. В строке 29 инициализируется ссылка на объект класса SimpleCat с использованием результатов вызова функции TheFunction, объявленной в строке25. Согласно объявлению эта функция возвращает ссылку на объект класса SimpleCat.В теле функции TheFunction объявляется локальный объект типа SimpleCat и инициализируется его возраст и вес. Затем этот объект возвращается по ссылке. Некоторые компиляторы обладают достаточным интеллектом, чтобы распознать эту ошибку, и не позволят вам запустить данную программу на выполнение. Другие же (сразу видно, кто настоящий друг) спокойно разрешат вам выполнить эту программу с непредсказуемыми последствиями.