Optional function parameters: Use default arguments (NULL) or overload the function?

c++, function, null, overloading, parameters

Solution

I would definitely favour the 2nd approach of overloaded methods.

The first approach (optional parameters) blurs the definition of the method as it no longer has a single well-defined purpose. This in turn increases the complexity of the code, making it more difficult for someone not familiar with it to understand it.

With the second approach (overloaded methods), each method has a clear purpose. Each method is well-structured and cohesive. Some additional notes:

- If there's code which needs to be duplicated into both methods, this can be extracted out into a separate method and each overloaded method could call this external method.

- I would go a step further and name each method differently to indicate the differences between the methods. This will make the code more self-documenting.

Problem

I have a function that processes a given vector, but may also create such a vector itself if it is not given. I see two design choices for such a case, where a function parameter is optional: Make it a pointer and make it `NULL` by default: ``` void foo(int i, std::vector<int>* optional = NULL) { if(optional == NULL){ optional = new std::vector<int>(); // fill vector with data } // process vector } ``` Or have two functions with an overloaded name, one of which leaves out the argument: ``` void foo(int i) { std::vector<int> vec; // fill vec with data foo(i, vec); } void foo(int i, const std::vector<int>& optional) { // process vector } ``` Are there reasons to prefer one solution over the other? I slightly prefer the second one because I can make the vector a `const` reference, since it is, when provided, only read, not written. Also, the interface looks cleaner (isn't `NULL` just a hack?). And the performance difference resulting from the indirect function call is probably optimized away. Yet, I often see the first solution in code. Are there compelling reasons to prefer it, apart from programmer laziness?

Original source