Вызов функции с передачей объекта по значению...171

We use cookies. Read the Privacy and Cookie Policy

Как вы знаете, С++ передаёт аргументы в функцию по ссылке при использовании в описании символа & ( см. главу 8, "Первое знакомство с указателями в С++" ). Однако по умолчанию С++ передаёт функции только значения аргументов. ( Обратитесь к главе 6, "Создание функций", если вы этого не знали. ) То же касается и составных, определённых пользователем объектов: они также передаются по значению.

    /* PassObjVal — попытка изменить значение объекта в функции оказывается неуспешной при передаче объекта по значению */

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    using namespace std ;

    class Student

    {

        public :

            int semesterHours ;

            float gpa ;

    } ;

    void someFn( Student copyS )

    {

            copyS.semesterHours = 10 ;

            copyS.gpa = 3.0 ;

            cout << "Значение copyS.gpa = "

                    << copyS.gpa << " " ;

    }

    int main( int argc , char* pArgs[ ] )

    {

        setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */

            Student s ;

            s.gpa = 0.0 ;

            /* Вывод значения s.gpa до вызова someFn( ) */

            cout << "Значение s.gpa = " << s.gpa << " " ;

            /* Передача существующего объекта */

            cout << "Вызов someFn( Student ) " ;

            someFn( s ) ;

            cout << "Возврат из someFn( Student ) " ;

            /* Значение s.gpa остаётся равным 0 */

            cout << "Значение s.gpa = " << s.gpa << " " ;

            /* Пауза для того, чтобы посмотреть на результат работы программы */

            system( "PAUSE" ) ; return 0 ;

    }

_________________

171 стр. Глава 14. Указатели на объекты

В этом примере функция main( ) создаёт объект s, а затем передаёт его в функцию someFn( ).

«Осуществляется передача по значению не самого объекта, а его копии.»

[Помни!]

Объект copyS начинает своё существование внутри функции someFn( ) и является точной копией объекта s из main( ). При этом любые изменения содержимого объекта copyS никак не отражаются на объекте s из функции main( ). Вот что даёт программа на выходе.

 

    Значение s.gpa = 0

    Вызов someFn( Student )

    Значение copyS.gpa = 3

    Возврат из someFn( Student )

    Значение s.gpa = 0

    Press any key to continue...