Search

Admin

7.2 — Passing arguments by value

By default, arguments in C++ are passed by value. When arguments are passed by value, a copy of the argument is passed to the function.

Consider the following snippet:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

voidfoo(inty)

{

usingnamespacestd;

cout<<"y = "<<y<<endl;

}

intmain()

{

foo(5);// first call

intx=6;

foo(x);// second call

foo(x+1);// third call

return0;

}

In the first call to foo(), the argument is the literal 5. When foo() is called, variable y is created, and the value of 5 is copied into y. Variable y is then destroyed when foo() ends.

In the second call to foo(), the argument is the variable x. x is evaluated to produce the value 6. When foo() is called for the second time, variable y is created again, and the value of 6 is copied into y. Variable y is then destroyed when foo() ends.

In the third call to foo(), the argument is the expression x+1. x+1 is evaluated to produce the value 7, which is passed to variable y. Variable y is once again destroyed when foo() ends.

Thus, this program prints:

y = 5
y = 6
y = 7

Because a copy of the argument is passed to the function, the original argument can not be modified by the function. This is shown in the following example:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

voidfoo(inty)

{

usingnamespacestd;

cout<<"y = "<<y<<endl;

y=6;

cout<<"y = "<<y<<endl;

}// y is destroyed here

intmain()

{

usingnamespacestd;

intx=5;

cout<<"x = "<<x<<endl;

foo(x);

cout<<"x = "<<x<<endl;

return0;

}

This snippet outputs:

x = 5
y = 5
y = 6
x = 5

At first, x is 5. When foo() is called, the value of x (5) is passed to variable y inside foo(). y is assigned the value of 6, and then destroyed. The value of x is unchanged, even though y was changed.

Every time you call a function with a value parameter, the parameter has to be copied. This can be expensive in terms of time or memory or both. If that same function is called 1,000 times, the value parameter will be copied 1,000 times (once for each call).