12/19/2016
Here we will go over references.
#include <cstdio> #include <vector> using namespace std; int main() { vector<int> list; list.push_back(13); /* Visual Studio: */ getchar(); return 0; }
We have declared the
variable list
as
a vector
of int
s. Then we add the
element 13
.
What is the value of list and list2 after the following code?
vector<int> list2 = list; list2.push_back(2);
Here we declare list2
and
initialize it as a copy
of list
. The result is
that list
has the
element 13
,
while list2
has the
elements 13
and 2
.
When we declare a variable, we declare that it is unique
and owns its contents.
Therefore, list2
starts
out as a unique copy
of list
and then is
modified to be different.
If we simply turn list2
into an reference, it will instead become an alias of
our list
:
vector<int>& list2 = list; list2.push_back(2);
A reference is signified with an ampersand
(&
). All usages of
this reference will effect the actual variable. Now both
lists have the
elements 13
and 2
.
What does vector contain at the end
of test
?
void push_back_32(vector<int> vector) { vector.push_back(32); } void test() { vector<int> vector; push_back_32(vector); }
Since push_back_32
takes
its parameter by value, as a variable and not a reference,
it makes a copy of the vector,
inserts 32
into the copy,
and then throws the copy away. The vector
in test
is unaffected by
this.
In order to correctly
insert 32
into the
caller's vector, we must take our parameter by reference:
void push_back_32(vector<int>& vector) { vector.push_back(32); }