In fact, the first constructor seems to be a special case of the second one with the initial size set to zero. It's a bit of a waste of effort to create and maintain two different versions of a similar function. A default argument is a value given in the declaration that the compiler automatically inserts if you don't provide a value in the function call. The identical constructor is called in both cases, but for A , the second argument is automatically substituted by the compiler when it sees the first argument is an int and that there is no second argument. The compiler has seen the default argument, so it knows it can still make the function call if it substitutes this second argument, which is what you've told it to do by making it a default.
Default arguments are a convenience, as function overloading is a convenience.
Both features allow you to use a single function name in different situations. The difference is that with default arguments the compiler is substituting arguments when you don't want to put them in yourself. There are two rules you must be aware of when using default arguments. First, only trailing arguments may be defaulted. That is, you can't have a default argument followed by a nondefault argument.