Strictly speaking, reading your question I expected you to provide these two examples
A a1(5); // method 1
A a2 = 5; // method 2
The first one is direct-initialization. The second one is copy-initialization.
The examples you provided in your question actually already illustrate the difference between the two :)
Direct-initialization initializes the target object directly, as a single-step process by finding and using an appropriate constructor. Copy-initialization is conceptually a two-step process: first it constructs a temporary object of type A
by some conversion constructor and then it copies it to the destination object by using a copy-constructor. I.e.
A a2 = 5;
will actually work as
A a2 = A(5);
And that actually exhaustively explains the difference.
The two-step structure of the second variant is, again, conceptual. The compilers are allowed (and will) optimize the second variant so that it will work exactly as the first one. They will eliminate the intermediate temporary object and perform initialzation directly.