Overloaded functions share a name but accept different parameter types or counts.

overload C++ chooses the overload whose parameter list best matches the arguments in the call.

Overloads

example
overloads.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>

std::string describe(int count) {
    return "count=" + std::to_string(count);
}

std::string describe(std::string label) {
    return "label=" + label;
}

int main() {
    int count = 3;
    std::string label = "ready";

    std::string countMessage = describe(count);
    std::string labelMessage = describe(label);

    std::cout << countMessage << std::endl;
    std::cout << labelMessage << std::endl;
    return 0;
}
#include <iostream>
#include <string>

std::string describe(int count) {
    return "count=" + std::to_string(count);
}

std::string describe(std::string label) {
    return "label=" + label;
}

int main() {
    int count = 1;
    std::string label = "ready";

    std::string countMessage = describe(count);
    std::string labelMessage = describe(label);

    std::cout << countMessage << std::endl;
    std::cout << labelMessage << std::endl;
    return 0;
}
#include <iostream>
#include <string>

std::string describe(int count) {
    return "count=" + std::to_string(count);
}

std::string describe(std::string label) {
    return "label=" + label;
}

int main() {
    int count = 5;
    std::string label = "ready";

    std::string countMessage = describe(count);
    std::string labelMessage = describe(label);

    std::cout << countMessage << std::endl;
    std::cout << labelMessage << std::endl;
    return 0;
}
#include <iostream>
#include <string>

std::string describe(int count) {
    return "count=" + std::to_string(count);
}

std::string describe(std::string label) {
    return "label=" + label;
}

int main() {
    int count = 3;
    std::string label = "queued";

    std::string countMessage = describe(count);
    std::string labelMessage = describe(label);

    std::cout << countMessage << std::endl;
    std::cout << labelMessage << std::endl;
    return 0;
}
#include <iostream>
#include <string>

std::string describe(int count) {
    return "count=" + std::to_string(count);
}

std::string describe(std::string label) {
    return "label=" + label;
}

int main() {
    int count = 3;
    std::string label = "done";

    std::string countMessage = describe(count);
    std::string labelMessage = describe(label);

    std::cout << countMessage << std::endl;
    std::cout << labelMessage << std::endl;
    return 0;
}
  1. count ← 3, label ← ready

    12int main() {13    int count→ 3 = 3; //@count=1, 514    std::string label→ ready = "ready"; //@label="queued", "done"1516    std::string countMessage = describe(count3);17    std::string labelMessage = describe(label);
  2. std::string describe(int count)

    4std::string describe(int count3) {5    return "count=" + std::to_string(count3);6}
  3. countMessage ← count=3

    16std::string countMessage→ count=3 = describe(count3);17std::string labelMessage = describe(labelready);
  4. std::string describe(std::string label)

    8std::string describe(std::string labelready) {9    return "label=" + labelready;10}
  5. labelMessage ← label=ready

    16    std::string countMessage = describe(count);17    std::string labelMessage→ label=ready = describe(labelready);1819    std::cout << countMessagecount=3 << std::endl;20    std::cout << labelMessagelabel=ready << std::endl;21    return 0;22}
    outputcount=3
    label=ready
  1. count ← 1, label ← ready

    12int main() {13    int count→ 1 = 1;14    std::string label→ ready = "ready";1516    std::string countMessage = describe(count1);17    std::string labelMessage = describe(label);
  2. std::string describe(int count)

    4std::string describe(int count1) {5    return "count=" + std::to_string(count1);6}
  3. countMessage ← count=1

    16std::string countMessage→ count=1 = describe(count1);17std::string labelMessage = describe(labelready);
  4. std::string describe(std::string label)

    8std::string describe(std::string labelready) {9    return "label=" + labelready;10}
  5. labelMessage ← label=ready

    16    std::string countMessage = describe(count);17    std::string labelMessage→ label=ready = describe(labelready);1819    std::cout << countMessagecount=1 << std::endl;20    std::cout << labelMessagelabel=ready << std::endl;21    return 0;22}
    outputcount=1
    label=ready
  1. count ← 5, label ← ready

    12int main() {13    int count→ 5 = 5;14    std::string label→ ready = "ready";1516    std::string countMessage = describe(count5);17    std::string labelMessage = describe(label);
  2. std::string describe(int count)

    4std::string describe(int count5) {5    return "count=" + std::to_string(count5);6}
  3. countMessage ← count=5

    16std::string countMessage→ count=5 = describe(count5);17std::string labelMessage = describe(labelready);
  4. std::string describe(std::string label)

    8std::string describe(std::string labelready) {9    return "label=" + labelready;10}
  5. labelMessage ← label=ready

    16    std::string countMessage = describe(count);17    std::string labelMessage→ label=ready = describe(labelready);1819    std::cout << countMessagecount=5 << std::endl;20    std::cout << labelMessagelabel=ready << std::endl;21    return 0;22}
    outputcount=5
    label=ready
  1. count ← 3, label ← queued

    12int main() {13    int count→ 3 = 3;14    std::string label→ queued = "queued";1516    std::string countMessage = describe(count3);17    std::string labelMessage = describe(label);
  2. std::string describe(int count)

    4std::string describe(int count3) {5    return "count=" + std::to_string(count3);6}
  3. countMessage ← count=3

    16std::string countMessage→ count=3 = describe(count3);17std::string labelMessage = describe(labelqueued);
  4. std::string describe(std::string label)

    8std::string describe(std::string labelqueued) {9    return "label=" + labelqueued;10}
  5. labelMessage ← label=queued

    16    std::string countMessage = describe(count);17    std::string labelMessage→ label=queued = describe(labelqueued);1819    std::cout << countMessagecount=3 << std::endl;20    std::cout << labelMessagelabel=queued << std::endl;21    return 0;22}
    outputcount=3
    label=queued
  1. count ← 3, label ← done

    12int main() {13    int count→ 3 = 3;14    std::string label→ done = "done";1516    std::string countMessage = describe(count3);17    std::string labelMessage = describe(label);
  2. std::string describe(int count)

    4std::string describe(int count3) {5    return "count=" + std::to_string(count3);6}
  3. countMessage ← count=3

    16std::string countMessage→ count=3 = describe(count3);17std::string labelMessage = describe(labeldone);
  4. std::string describe(std::string label)

    8std::string describe(std::string labeldone) {9    return "label=" + labeldone;10}
  5. labelMessage ← label=done

    16    std::string countMessage = describe(count);17    std::string labelMessage→ label=done = describe(labeldone);1819    std::cout << countMessagecount=3 << std::endl;20    std::cout << labelMessagelabel=done << std::endl;21    return 0;22}
    outputcount=3
    label=done

Follow the Overloads

  1. count starts as 3.
  2. label starts as ready.
  3. describe(count) uses the overload that accepts an int.
  4. describe(label) uses the overload that accepts a string.
  5. The program prints count=3 and label=ready. | call | overload chosen | output | | --- | --- | --- | | describe(count) | int | count=3 | | describe(label) | string | label=ready |

Exercise: overloads.cpp

Reproduce count=3 and label=ready, then change only count to 5 to predict count=5, and change only label to done to predict label=done.