'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 |
