CS253: Software Development with C++

Fall 2018

Functions

See this page as a slide show

CS253 Functions

made at imgflip.com

Functions

By & large, C++ functions look like Java functions:

int sum(int a, int b) {
    return a+b;
}

int main() {
    cout << sum(2, 40) << '\n';
}
42

Default Parameters

Functions can have default trailing arguments:

int sum(int a, int b = 1) {
    return a+b;
}

int main() {
    cout << sum(2, 40) << '\n'
         << sum(8) << '\n';
}
42
9

Default Parameters

All default arguments must be piled up at the end:

int sum(int a = 123, int b = 456) {
    return a+b;
}

int main() {
    cout << sum(2, 40) << '\n'
         << sum(8) << '\n'
         << sum() << '\n';
}
42
464
579

Function Overloading

Like Java, C++ can have multiple versions of the same function that take different arguments:

int sum(int a, int b) { return a+b; } 
int sum(int a) { return a+456; } 
int sum() { return 123+456; } 

int main() {
    cout << sum(2, 40) << '\n'
         << sum(8) << '\n'
         << sum() << '\n';
}
42
464
579

Function Overloading

The types don’t have to be the same, either:

int sum(int a, int b) { return a+b; } 
double sum(int a) { return a+4.5; } 
string sum(double) { return "I can’t deal with double"; } 
const char *sum() { return "You are a bonehead"; } 

int main() {
    cout << sum(2, 40) << '\n'
         << sum(8) << '\n'
         << sum(123.456) << '\n'
         << sum() << '\n';
}
42
12.5
I can’t deal with double
You are a bonehead

Implementation

Name Mangling

Return type doesn’t matter

int foo() { return 1; }
double foo() { return 2.0; }
int main() {
    return 0;
}
c.cc:2: error: ambiguating new declaration of 'double foo()'

Name Mangling

$ cat ~cs253/Examples/overload.cc
int sum(int a, int b) { return a+b; }
double sum(int a) { return a+4.5; }
const char *sum() { return "You are a bonehead"; }
bool sum(double, int, short) { return false; }

$ g++ -c ~cs253/Examples/overload.cc

$ nm --numeric-sort overload.o
0000000000000000 T _Z3sumii
0000000000000014 T _Z3sumi
000000000000002e T _Z3sumv
0000000000000039 T _Z3sumdis

$ nm --numeric-sort --demangle overload.o
0000000000000000 T sum(int, int)
0000000000000014 T sum(int)
000000000000002e T sum()
0000000000000039 T sum(double, int, short)

User: Guest

Check: HTML CSS
Edit History Source

Modified: 2018-06-14T18:59

Apply to CSU | Contact CSU | Disclaimer | Equal Opportunity
Colorado State University, Fort Collins, CO 80523 USA
© 2018 Colorado State University
CS Building