【C++】関数のオーバーロード活用の2大パターン(引数の型・数の違い)

目次

はじめに

C++の関数のオーバーロードは、「同じ名前で、引数リストが異なる関数を複数定義できる」機能です。この「引数リストが異なる」という条件は、主に2つのパターンに分類できます。

  1. 引数のデータ型が異なるパターン
  2. 引数の個数が異なるパターン

これらのパターンを理解し、適切に使い分けることで、より柔軟で直感的なクラスを設計することができます。この記事では、それぞれのパターンについて、具体的なサンプルコードと共に解説します。


1. 引数の「型」が異なるパターン

これは、関数の基本的な処理内容は同じでありながら、扱うデータの種類(型)によって、細かな実装が変わる場合に非常に有効です。例えば、「足し算」という同じ目的でも、整数同士の足し算と、小数同士の足し算では、内部的な扱いが異なります。

サンプルコード

#include <iostream>

using namespace std;

class Calculator {
public:
    // int型同士を加算するadd関数
    int add(int a, int b) {
        cout << "int型で計算: ";
        return a + b;
    }
    
    // double型同士を加算するadd関数
    double add(double a, double b) {
        cout << "double型で計算: ";
        return a + b;
    }
};

int main() {
    Calculator calc;
    
    // int型の引数を渡したので、int版のaddが呼ばれる
    cout << calc.add(10, 20) << endl;
    
    // double型の引数を渡したので、double版のaddが呼ばれる
    cout << calc.add(3.14, 2.71) << endl;
    
    return 0;
}

実行結果

int型で計算: 30
double型で計算: 5.85

解説: addという同じ関数名で、int型とdouble型の両方に対応できています。呼び出し側は、引数の型を気にする必要がなく、直感的にadd関数を使うことができます。


2. 引数の「個数」が異なるパターン

これは、引数の数によって、関数の振る舞いやデフォルト動作を変化させたい場合に有効です。引数がない場合は標準のメッセージを、引数が一つあればそのメッセージを、引数が二つあればそのメッセージを指定回数表示する、といった柔軟な機能を提供できます。

サンプルコード

#include <iostream>
#include <string>

using namespace std;

class Greeter {
public:
    // パターン1: 引数なし
    void greet();
    
    // パターン2: 文字列の引数1つ
    void greet(string name);
    
    // パターン3: 文字列と整数の引数2つ
    void greet(string name, int repeatCount);
};

void Greeter::greet() {
    cout << "Hello!" << endl;
}

void Greeter::greet(string name) {
    cout << "Hello, " << name << "!" << endl;
}

void Greeter::greet(string name, int repeatCount) {
    for (int i = 0; i < repeatCount; i++) {
        cout << "Hello, " << name << "!" << endl;
    }
}

int main() {
    Greeter myGreeter;
    
    myGreeter.greet(); // 引数なし版が呼ばれる
    myGreeter.greet("Sato"); // 引数1つ版が呼ばれる
    myGreeter.greet("Suzuki", 3); // 引数2つ版が呼ばれる
    
    return 0;
}

実行結果

Hello!
Hello, Sato!
Hello, Suzuki!
Hello, Suzuki!
Hello, Suzuki!

解説: greetという一つの関数名が、渡される引数の個数や型に応じて、3つの異なる振る舞いをしています。これにより、利用者はgreet, greetWithName, greetWithNameAndCountのように、たくさんの関数名を覚える必要がなくなります。


まとめ

今回は、関数のオーバーロードを使いこなすための2つの主要なパターンを解説しました。

  • 引数の「型」を変える: 同じ操作を、異なるデータ型に対応させる。
  • 引数の「個数」を変える: 同じ操作に、オプションの引数や異なる動作モードを提供する。

オーバーロードを効果的に活用することで、クラスの利用者が迷うことなく、直感的に使えるインターフェースを設計することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次