Well, "Serial.write" and "tone" also have some optional arguments. I don't understand, why I couldn't use them?
...
Because those are classes, not functions. Classes can have multiple methods with varying arguments.
In C++ any function can have optional arguments. Example:
int foo (int a, int b, int c = 0, bool d = false)
{
int result = a + b;
if (d)
result -= c;
else
result += c;
return result;
}
void setup ()
{
foo (1, 2);
foo (4, 5, 6);
foo (8, 9, 42, true);
} // end of setup
void loop () { }