Главная->Інформатика та програмування->Содержание->Передача простой переменной

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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. Передача в функцию по указателю

Передача указателя в функцию в качестве аргумента в некоторых случаях похожа на передачу по ссылке. Они обе позволяют переменной вызывающей программы быть измененной в функции. Однако их механизмы различны. Ссыл- ка — это псевдоним переменной, а указатель — это адрес переменной.

 

13