Its not required that the copy constructor be const. However const reference has a neat little ability to take both references and values. In the above case you did not provide a copy constructor that took an Apple by value.

What the compiler did was to modify the code slightly. Without looking at the resulting assembly code I would theorize that the compiler did one of the two following things:
1) It passed a reference to operator+ that was used to create the return object
or
2) It inlined operator+ so that it became:
Apple C(A.num + b.num);