ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 10) онлайн
Передача простой переменной
Сначала мы рассмотрим передачу аргумента по ссылке, а затем сравним ее с пе- редачей по указателю. В программе PASSREF рассмотрена передача по ссылке.
// passref.cpp
// передача аргумента по ссылке
#include <iostream>
using namespace std;
int main ( )
{
void centimize ( double& ); // прототип функции
double var = 10.0; // значение переменной var равно 10 (дюймов)
cout << "var = " << var << "дюймов" << endl;
centimize ( var ); // переведем дюймы в сантиметры
cout << "var= " << var << "сантиметров" << endl;
return 0;
}
///////////////////////////////////////////////////////////
void centimize ( double& v )
{
v *= 2.54; // v — это то же самое, что и var
}
В этом примере мы хотим преобразовать значение переменной var функции main() из дюймов в сантиметры. Мы передаем переменную по ссылке в функ- цию centimize(). (Помним, что &, следующий за типом double в прототипе этой функции, означает, что аргумент передается по ссылке.) Функция centimize()
умножает первоначальное значение переменной на 2,54. Обратим внимание, как функция ссылается на переменную. Она просто использует имя аргумента v; v и var — это различные имена одного и того же.
После преобразования var в сантиметры функция main() выведет полученный результат. Итог работы программы PASSREF:
var = 10 дюймов var = 25.4 сантиметров
В следующем примере PASSPTR мы рассмотрим, как в аналогичной ситуации используются указатели.
// passptr.cpp
// передача аргумента по указателю
#include <iostream>
using namespace std;
int main ( )
{
void centimize ( double* ); // прототип функции
double var = 10.0; // значение переменной var равно 10 (дюймов)
cout << "var = " << var << "дюймов" << endl;
centimize ( &var ); // переведем дюймы в сантиметры
cout << "var= " << var << "сантиметров" << endl;
return 0;
}
///////////////////////////////////////////////////////////
void centimize ( double* ptrd )
{
*ptrd *= 2.54; // *ptrd — это то же самое, что и var
}
Результаты работы программ PASSPTR и PASSREF одинаковы. Функция centimize() объявлена использующей параметр как указатель на double:
void centimize ( double* ); // аргумент - указатель на double
Когда функция main() вызывает функцию centimize(), она передает в качестве аргумента адрес переменной:
centimize ( &var );
Помним, что это не сама переменная, как это происходит при передаче по ссылке, а ее адрес.
Так как функция centimize() получает адрес, то она может использовать опе- рацию разыменования *ptrd для доступа к значению, расположенному по этому адресу:
*ptrd *= 2.54; // умножаем содержимое переменной по адресу ptrd на 2.54
Это то же самое, что *ptrd = *ptrd * 2.54;
где одиночная звездочка означает умножение (эта операция действительно рас- пространена).
Так как ptrd содержит адрес переменной var, то все действия, которые мы совершим с *ptrd, мы в действительности проделаем с var. На рис. 10.6 показано, как изменение *ptrd в функции изменяет переменную var в вызывающей про- грамме.
main() centimize()

main() передает адрес переменной var в ptrd в centimize()
centimize() использует этот адрес для доступа к var
Рис. 10.6. Передача в функцию по указателю
Передача указателя в функцию в качестве аргумента в некоторых случаях похожа на передачу по ссылке. Они обе позволяют переменной вызывающей программы быть измененной в функции. Однако их механизмы различны. Ссыл- ка — это псевдоним переменной, а указатель — это адрес переменной.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
Схожі підручники
- ENGLISH FOR FINANCE НАВЧАЛЬНИЙ ПОСІБНИК
- МЕТОДИЧНІ ВКАЗІВКИ ДO ВИКОНАННЯ ІНДИВІДУАЛЬНИХ ЗАВДАНЬ З КУРСУ «Професійна психологія та конфліктологія»
- Загальні питання з курсу Українська мова
- Стан НПС та основні напрями природоохоронної політики Чехії управлінські, організаційні, економічні та юридичні аспекти
- ГРОШІ І КРЕДИТ (частина 2)
- Загальні питання з курсу «Теорія ймовірності та Математичної статистики»№1
