'How does object initialization ambiguity get resolved?
The class has two constructors, one that has no initialization value and does not increase the 'val', the other takes a reference to an object, and increases 'val'. How come, by initializing with 'A a,b = a;' a.get << b.get outputs '22' ? I expected '12'. Many thanks in advance.
class A
{
int *val;
public:
A() { val = new int; *val = 0; }
A(A &a) { val = new int; *val = a.get(); }
int get() { return ++(*val); }
~A () { delete val; }
};
main:
[...]
A a,b = a;
cout << a.get() << b.get(); // 22 ????
//cout << a.get(); // 1 if A a init, 2 if A a = a init, OK.
//cout << a.get() << b.get(); // 33 if A a = a, A b = a init.
[...]
Solution 1:[1]
Because in the A
copy-constructor (which should really take its arguments as a reference to a const
) you call a.get()
. That increases *a.val
from 0
to 1
.
Then you call a.get()
for the output, which increases *a.val
from 1
to 2
.
To get the expected behavior you should copy *a.val
directly instead:
A(A const& a)
: val(new int(*a.val))
{}
Solution 2:[2]
a
is default-constructed, so it sets *(a.val)
to 0.
b
is copy-constructed from a
, so it first calls a.get()
, incrementing *(a.val)
to 1 and returning that new value, so *(b.val)
gets set to 1, not 0.
Then you print the output of calling a.get()
and b.get()
, incrementing both *(a.val)
and *(b.val)
to 2 and returning those new values.
That is why you see 22
displayed.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Some programmer dude |
Solution 2 |