OVERLOADING

Overloading is used for allowing multiple functions with the same name to have different behaviour.

The output does not matter in overloading.

Are the following overloads?

void lookup (Account);
void lookup (Account const);

void lookup(Account acc) {
  //... Account acct;
        lookup(acct);
}


void lookup(Account const acc) {
  //... Account acct;
        lookup(acct);
}

NO. The parameter is being passed in by pass by value. In both cases, a copy is being made. The compiler ignores the const.

int const ci=0;
int i=10;

int const *c=%ci;
int *const tc=&i; 
string s{"seattle"};
print(s);
print("singapore");
string const t{"seoul"};
print(t);
void printf(string) //works with "seattle", not with "singapore"
void print(string const &) //works with "seattle", works with "singapore"
void print(string &);
string s{"seattle"};
print(s);
void f(int);
void f(double);
char ch=10;
f(ch); //which function call does it pick

Because chars are logically promoted to ints. However, this will never be tested because who the hell remembers these things.

Str::Str() : mLen(0), mPtr(new char [mLen+1]) { //This sets default members
  *mPtr='\0';
}

Ambiguous calls causes a compile time error due to ambiguouity.

Perfect Fit, Promotion, Conversion (Promotion takes priority over Conversion)

Perfect Fit

Promotion char->int short->int

Conversion char->short

void fn(T1 a, T2 b) //random, a and b have equal priority, perfect fit, then promotion, then conversion)

IMPORTANT: RETURN TYPE DOES NOT MATTER

If downgrading is chosen, then warning

returning by value on an overloaded function is equal to calling the copy constructor.