Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 31

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 25 26 27 28 29 30 < 31 > 32 33 34 35 36 37 .. 204 >> Следующая

}
Имена Области памяти
Рис. 3.1. Переменная, ссылка и указатель на нее
В этом примере функции FuncA и FuncB увеличивают значение параметра Parm. Однако только функция FuncA, которая получает параметр как ссылку, изменяет значение переменной N, передаваемой из вызывающей функции. Нельзя передать константу (например, 5) как параметр, если последний не объявлен как ссылка на тип const (см. параграф "Константы и функции").
void FuncA (int SRInt); void main () {
FuncA (5); // ОШИБКА: ссылка ке может инициализироваться // значением константы
// . . .
}
Если в функцию передается переменная большого размера (например, большая структура), то использование ссылочного параметра сделает вызов функции более эффективным. При нессылочном параметре все содержимое переменной копируется в параметр. При ссылочном параметре он только инициализируется, ссылаясь непосредственно на оригинал переменной. Отдельная копия переменной при этом не создается.
Чтобы использовать преимущества, предоставляемые ссылочным параметром, в языке С++, как и в языке С, можно использовать в качестве параметра указатель. (В частности, возможность изменения переменной, передаваемой вызывающей программой, и устранение операции копирования.) Однако ссылочными параметрами можно манипулировать с помощью более простого синтаксиса, подобного применяемому при работе с обычными переменными.
Оператором &, можно объявить функцию, возвращающую ссылку. Например:
int & Getlndex ();
Это объявление означает, что при вызове функции Getlndex будет создан временный псевдоним для некоторой целочисленной переменной (определяемой оператором return внутри функции). Следовательно, вызов функции Getlndex может находиться в любом месте выражения, содержащего данную целочисленную переменную, например:
int N;
N = Getlndex (); // копирует значение переменной типа int
Getlndex () =5; // присваивает 5 переменной типа int.
++Getlndex (); // увеличивает значение переменной типа int
Следующий код показывает, как можно реализовать функцию Getlndex, и иллюстрирует эффект вызова функции.
int Index = 0; int & Getlndex () {
return Index;
}
void main () {
int N;
// здесь Index равно О
N = Getlndex ();
// здесь Index равно 0 и N равно О
Getlndex () = 5;
// здесь Index равно 5
++Getlndex ();
// здесь Index равно 6
}
Функция, возвращаемое значение которой является ссылкой, должна возвращать переменную соответствующего типа и может возвращать константу,-например 5, только в случае, если она объявлена как возвращающая ссылку на тип const (см. параграф "Константы и функции"). Возвращаемая переменная используется для инициализации временной ссылочной переменной, создаваемой при вызове функции. Другими словами, полагая, что index и Getlndex определены так, как показано выше, оператор
++Getlndex (); // вызов функции приводит к созданию временной
// ссылочной переменной, являющейся псевдонимом
// переменной Index
эквивалентен коду
int STemp = Index; // объявление и инициализация действительной // ссылки на переменную
++Тетр;
В этих примерах значение переменной Index увеличивается на 1.
Поскольку ссылка, создаваемая при вызове функции, используется после возврата из функции, последняя не может возвратить ссылку на переменную, которая уничтожается после выхода из функции. Например, нельзя возвратить ссылку на автоматическую переменную или параметр, как показано в следующем "опасном" коде.
int &BadIdeal О (
int i ;
return i; }
int &BadIdea2 (int Parm) (
return Parm; )
Этот код не вызывает ошибок компилятора, однако результат использования ссылки одной из этих функций непредсказуем. Функция, возвращающая ссылку, может "безопасно" вернуть только глобальную переменную, переменную типа static или переменную, память для которой выделяется динамически (см. параграф "Операторы new и delete").
С другой стороны, функция, возвращающая нессылочный тип, может выполнить "безопасный" возврат автоматической переменной или параметра, потому что при
вызове функции создается отдельная копия содержимого переменной, а не просто генерируется ссылка на нее. Именно по этой причине функция, возвращающая значение, не являющееся ссылкой, менее эффективна, чем функция, возвращающая ссылку, особенно если она возвращает большой объект данных.
Примечание
В гл. 6 приведены примеры передачи и возврата ссылок из функций.
Константы
Используя ключевое слово const, можно определить переменную для хранения значения константы.
const int MaxLines = 100;
Примечание
Объект типа const иногда называют именованной константой, а не переменной типа константа, так как употребление термина переменная в данном случае неправомерно.
Для определения константной переменной (типа const) ее необходимо инициализировать. Инициализация, выполняемая один раз, является единственно возможным способом задания значения константной переменной, которое нельзя изменить, используя операцию присваивания. Следующий код иллюстрирует допустимые и недопустимые операции с константами.
const double CD = 2.5; double D;
Предыдущая << 1 .. 25 26 27 28 29 30 < 31 > 32 33 34 35 36 37 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100