モダンC++とCでの代替手法

C++の関数オーバーロードとCでの代わりの方法

このレッスンでは、C++の関数オーバーロード(function overloading)で1つの関数名をいろいろな型に使い、Cでのやり方と比べます。

はじめに

関数オーバーロード(function overloading)を使うと、名前が同じで引数の型が違う関数を複数作れます。呼び出すとき、C++のコンパイラは引数の型から合うバージョンを自動で選びます。Cにはこの機能がないので、関数ごとに別の名前を付ける必要があります。

大切なポイント

  • C++の抽象化を学ぶ前に、Cでのやり方を理解しましょう。
  • RAIIと値のセマンティクス(value semantics)で、リソースの持ち主を表しましょう。
  • マクロや型変換より、C++の型安全な道具を優先しましょう。

CとC++のコード例

C
実行 →
main.c
#include <stdio.h>

int max_int(int left, int right) {
    return left > right ? left : right;
}

double max_double(double left, double right) {
    return left > right ? left : right;
}

int main(void) {
    printf("%d %.1f\n", max_int(3, 8), max_double(4.5, 2.0));
}
実行結果
8 4.5
C++
実行 →
main.cpp
#include <iostream>

int maximum(int left, int right) {
    return left > right ? left : right;
}

double maximum(double left, double right) {
    return left > right ? left : right;
}

int main() {
    std::cout << maximum(3, 8) << ' '
              << maximum(4.5, 2.0) << '\n';
}
実行結果
8 4.5

CとC++の比較

Cでは、2つの関数max_intとmax_doubleの名前に型を書いておく必要があります。C++ではどちらもmaximumという名前で、コンパイラは引数がintかdoubleかで正しいバージョンを選びます。この選択はコンパイル時に行われるので、プログラムが遅くなることはありません。

C

Cは名前付けの習慣、コールバック、マクロ、文脈を持つstructを使います。

C++

C++はスコープがはっきりした型安全な抽象化を用意しており、実行時のコストはふつうかかりません。

発展問題

両方のバージョンを実行し、コードを書き換えて、それぞれの言語がもたらす安全性の違いを観察しましょう。

  • まずCで仕組みを書き、その後で対応するC++の機能を使いましょう。
  • 手作業のリソース解放をRAIIに置き換えましょう。
  • その機能がメモリの確保や仮想関数の呼び出しを生むかどうかを確認しましょう。

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ